// Code generated by protoc-gen-go. DO NOT EDIT.
// source: config/api/component_id.proto

package api

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

// Uniquely identifies any component used in manufacturing a device.
type ComponentId struct {
	Value                string   `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ComponentId proto.InternalMessageInfo

func (m *ComponentId) GetValue() string {
	if m != nil {
		return m.Value
	}
	return ""
}

func init() {
	proto.RegisterType((*ComponentId)(nil), "chromiumos.config.api.ComponentId")
}

func init() { proto.RegisterFile("config/api/component_id.proto", fileDescriptor_59b34151f3ee8a4b) }

var fileDescriptor_59b34151f3ee8a4b = []byte{
	// 129 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4d, 0xce, 0xcf, 0x4b,
	0xcb, 0x4c, 0xd7, 0x4f, 0x2c, 0xc8, 0xd4, 0x4f, 0xce, 0xcf, 0x2d, 0xc8, 0xcf, 0x4b, 0xcd, 0x2b,
	0x89, 0xcf, 0x4c, 0xd1, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x4d, 0xce, 0x28, 0xca, 0xcf,
	0xcd, 0x2c, 0xcd, 0xcd, 0x2f, 0xd6, 0x83, 0xa8, 0xd4, 0x4b, 0x2c, 0xc8, 0x54, 0x52, 0xe6, 0xe2,
	0x76, 0x86, 0x29, 0xf6, 0x4c, 0x11, 0x12, 0xe1, 0x62, 0x2d, 0x4b, 0xcc, 0x29, 0x4d, 0x95, 0x60,
	0x54, 0x60, 0xd4, 0xe0, 0x0c, 0x82, 0x70, 0x9c, 0xb4, 0xa2, 0x34, 0xd2, 0xf3, 0xf5, 0x60, 0x06,
	0xe8, 0xe5, 0x17, 0xa5, 0xeb, 0x23, 0x4c, 0xd3, 0x87, 0xda, 0x9b, 0x9e, 0x0f, 0xb2, 0x3a, 0x89,
	0x0d, 0x6c, 0x9d, 0x31, 0x20, 0x00, 0x00, 0xff, 0xff, 0x5a, 0xea, 0xb1, 0xf3, 0x8f, 0x00, 0x00,
	0x00,
}
