// Code generated by protoc-gen-go. DO NOT EDIT.
// source: lab_platform/stable_faft_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

// FaftVersion is an association between a given ChromeOS version
// and a string uniquely identifying the faft firmware version.
// next tag: 3
type StableFaftVersion 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 *StableFaftVersion) Reset()         { *m = StableFaftVersion{} }
func (m *StableFaftVersion) String() string { return proto.CompactTextString(m) }
func (*StableFaftVersion) ProtoMessage()    {}
func (*StableFaftVersion) Descriptor() ([]byte, []int) {
	return fileDescriptor_1191aa1cf4bd7027, []int{0}
}

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

var xxx_messageInfo_StableFaftVersion proto.InternalMessageInfo

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

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

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

func init() {
	proto.RegisterFile("lab_platform/stable_faft_version.proto", fileDescriptor_1191aa1cf4bd7027)
}

var fileDescriptor_1191aa1cf4bd7027 = []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, 0x4b, 0x4c, 0x2b, 0x89, 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, 0x2d, 0x31, 0xad, 0x24, 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, 0x19, 0x89,
	0x7c, 0xf9, 0x00, 0x01, 0x00, 0x00,
}
