// Code generated by protoc-gen-go. DO NOT EDIT.
// source: go.chromium.org/luci/common/tsmon/examples/beep/dummy_project/dummy_project.proto

package dummy_project

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	math "math"
)

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package

type DummyProject struct {
	// The project id that uniquely identifies the dummy project owning the data.
	Project string `protobuf:"bytes,10,opt,name=project,proto3" json:"project,omitempty"`
	// The location (e.g., GCE zone, Metro, Lab, etc), where the project is
	// located.
	Location string `protobuf:"bytes,20,opt,name=location,proto3" json:"location,omitempty"`
	// Uniquely identifies the worker instance which processed a given request.
	WorkerId int64 `protobuf:"varint,30,opt,name=worker_id,json=workerId,proto3" json:"worker_id,omitempty"`
	// Whether a given project is staging or not.
	IsStaging            bool     `protobuf:"varint,40,opt,name=is_staging,json=isStaging,proto3" json:"is_staging,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *DummyProject) Reset()         { *m = DummyProject{} }
func (m *DummyProject) String() string { return proto.CompactTextString(m) }
func (*DummyProject) ProtoMessage()    {}
func (*DummyProject) Descriptor() ([]byte, []int) {
	return fileDescriptor_1ee4a422b2719059, []int{0}
}

func (m *DummyProject) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_DummyProject.Unmarshal(m, b)
}
func (m *DummyProject) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_DummyProject.Marshal(b, m, deterministic)
}
func (m *DummyProject) XXX_Merge(src proto.Message) {
	xxx_messageInfo_DummyProject.Merge(m, src)
}
func (m *DummyProject) XXX_Size() int {
	return xxx_messageInfo_DummyProject.Size(m)
}
func (m *DummyProject) XXX_DiscardUnknown() {
	xxx_messageInfo_DummyProject.DiscardUnknown(m)
}

var xxx_messageInfo_DummyProject proto.InternalMessageInfo

func (m *DummyProject) GetProject() string {
	if m != nil {
		return m.Project
	}
	return ""
}

func (m *DummyProject) GetLocation() string {
	if m != nil {
		return m.Location
	}
	return ""
}

func (m *DummyProject) GetWorkerId() int64 {
	if m != nil {
		return m.WorkerId
	}
	return 0
}

func (m *DummyProject) GetIsStaging() bool {
	if m != nil {
		return m.IsStaging
	}
	return false
}

func init() {
	proto.RegisterType((*DummyProject)(nil), "DummyProject")
}

func init() {
	proto.RegisterFile("go.chromium.org/luci/common/tsmon/examples/beep/dummy_project/dummy_project.proto", fileDescriptor_1ee4a422b2719059)
}

var fileDescriptor_1ee4a422b2719059 = []byte{
	// 191 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x54, 0xce, 0x31, 0xab, 0xc2, 0x30,
	0x10, 0xc0, 0x71, 0xc2, 0x83, 0xf7, 0xda, 0xe3, 0x4d, 0xc1, 0x21, 0x28, 0x4a, 0x71, 0xca, 0xd4,
	0x0c, 0x7e, 0x05, 0x17, 0x37, 0xad, 0x1f, 0xa0, 0xb4, 0x69, 0x88, 0xd1, 0xa6, 0x17, 0x92, 0x14,
	0x75, 0xf3, 0xa3, 0x4b, 0x5b, 0x15, 0x5c, 0x0e, 0xfe, 0xbf, 0xbb, 0xe1, 0xe0, 0xa0, 0x31, 0x97,
	0x27, 0x8f, 0xd6, 0xf4, 0x36, 0x47, 0xaf, 0x45, 0xdb, 0x4b, 0x23, 0x24, 0x5a, 0x8b, 0x9d, 0x88,
	0x61, 0x98, 0xea, 0x56, 0x59, 0xd7, 0xaa, 0x20, 0x6a, 0xa5, 0x9c, 0x68, 0x7a, 0x6b, 0xef, 0xa5,
	0xf3, 0x78, 0x56, 0x32, 0x7e, 0x57, 0xee, 0x3c, 0x46, 0x5c, 0x3f, 0x08, 0xfc, 0x6f, 0x07, 0xdf,
	0x4f, 0x4c, 0x19, 0xfc, 0xbd, 0x2e, 0x18, 0x64, 0x84, 0xa7, 0xc5, 0x3b, 0xe9, 0x1c, 0x92, 0x16,
	0x65, 0x15, 0x0d, 0x76, 0x6c, 0x36, 0xae, 0x3e, 0x4d, 0x17, 0x90, 0x5e, 0xd1, 0x5f, 0x94, 0x2f,
	0x4d, 0xc3, 0x56, 0x19, 0xe1, 0x3f, 0x45, 0x32, 0xc1, 0xae, 0xa1, 0x4b, 0x00, 0x13, 0xca, 0x10,
	0x2b, 0x6d, 0x3a, 0xcd, 0x78, 0x46, 0x78, 0x52, 0xa4, 0x26, 0x1c, 0x27, 0xa8, 0x7f, 0xc7, 0x4f,
	0x36, 0xcf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x6d, 0x33, 0x15, 0x88, 0xde, 0x00, 0x00, 0x00,
}
