// Code generated by protoc-gen-go. DO NOT EDIT.
// source: lab_platform/stable_cros_version.proto

package lab_platform

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

// StableCrosVersion describes a ChromeOS version with a given stable version
// ID.
// next tag: 3
type StableCrosVersion struct {
	Key                  *StableVersionKey `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"`
	Version              string            `protobuf:"bytes,2,opt,name=version,proto3" json:"version,omitempty"`
	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
	XXX_unrecognized     []byte            `json:"-"`
	XXX_sizecache        int32             `json:"-"`
}

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

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

var xxx_messageInfo_StableCrosVersion proto.InternalMessageInfo

func (m *StableCrosVersion) GetKey() *StableVersionKey {
	if m != nil {
		return m.Key
	}
	return nil
}

func (m *StableCrosVersion) GetVersion() string {
	if m != nil {
		return m.Version
	}
	return ""
}

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

func init() {
	proto.RegisterFile("lab_platform/stable_cros_version.proto", fileDescriptor_e671c3348835766f)
}

var fileDescriptor_e671c3348835766f = []byte{
	// 182 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0xcb, 0x49, 0x4c, 0x8a,
	0x2f, 0xc8, 0x49, 0x2c, 0x49, 0xcb, 0x2f, 0xca, 0xd5, 0x2f, 0x2e, 0x49, 0x4c, 0xca, 0x49, 0x8d,
	0x4f, 0x2e, 0xca, 0x2f, 0x8e, 0x2f, 0x4b, 0x2d, 0x2a, 0xce, 0xcc, 0xcf, 0xd3, 0x2b, 0x28, 0xca,
	0x2f, 0xc9, 0x17, 0xe2, 0x41, 0x56, 0x27, 0xa5, 0x8a, 0x4d, 0x17, 0x54, 0x43, 0x7c, 0x76, 0x6a,
	0x25, 0x44, 0x93, 0x52, 0x3c, 0x97, 0x60, 0x30, 0x58, 0xce, 0xb9, 0x28, 0xbf, 0x38, 0x0c, 0x22,
	0x2d, 0x64, 0xc0, 0xc5, 0x9c, 0x9d, 0x5a, 0x29, 0xc1, 0xa8, 0xc0, 0xa8, 0xc1, 0x6d, 0x24, 0xa7,
	0x87, 0x6c, 0x92, 0x1e, 0x44, 0x35, 0x54, 0xa5, 0x77, 0x6a, 0x65, 0x10, 0x48, 0xa9, 0x90, 0x04,
	0x17, 0x3b, 0xd4, 0x6c, 0x09, 0x26, 0x05, 0x46, 0x0d, 0xce, 0x20, 0x18, 0xd7, 0xc9, 0x22, 0xca,
	0x2c, 0x3d, 0x5f, 0x2f, 0x39, 0xa3, 0x28, 0x3f, 0x37, 0xb3, 0x34, 0x57, 0x2f, 0xbf, 0x28, 0x5d,
	0x1f, 0xc6, 0xc9, 0x2f, 0xd6, 0xcf, 0xcc, 0x4b, 0x2b, 0x4a, 0xd4, 0x07, 0x3b, 0x45, 0x3f, 0x3d,
	0x5f, 0x1f, 0xd9, 0xa6, 0x24, 0x36, 0xb0, 0xb0, 0x31, 0x20, 0x00, 0x00, 0xff, 0xff, 0x8d, 0xcc,
	0x81, 0x43, 0x00, 0x01, 0x00, 0x00,
}
