// Code generated by protoc-gen-go. DO NOT EDIT.
// source: build/build_config.proto

package build_config

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

// A single ChromeOS Config payload.
//
// The generated ChromeOS Config JSON uses "-", which is not valid in a proto
// field name. Use json_name, so the JSON can be parsed directly into / out of
// this proto.
type ChromeOSConfig struct {
	Identity        *ChromeOSConfig_Identity        `protobuf:"bytes,1,opt,name=identity,proto3" json:"identity,omitempty"`
	Arc             *ChromeOSConfig_Arc             `protobuf:"bytes,2,opt,name=arc,proto3" json:"arc,omitempty"`
	Firmware        *ChromeOSConfig_Firmware        `protobuf:"bytes,3,opt,name=firmware,proto3" json:"firmware,omitempty"`
	FirmwareSigning *ChromeOSConfig_FirmwareSigning `protobuf:"bytes,4,opt,name=firmware_signing,json=firmware-signing,proto3" json:"firmware_signing,omitempty"`
	// Unique name for the given model.
	Name string `protobuf:"bytes,5,opt,name=name,proto3" json:"name,omitempty"`
	// Brand code of the model (also called RLZ code).
	BrandCode            string   `protobuf:"bytes,6,opt,name=brand_code,json=brand-code,proto3" json:"brand_code,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ChromeOSConfig proto.InternalMessageInfo

func (m *ChromeOSConfig) GetIdentity() *ChromeOSConfig_Identity {
	if m != nil {
		return m.Identity
	}
	return nil
}

func (m *ChromeOSConfig) GetArc() *ChromeOSConfig_Arc {
	if m != nil {
		return m.Arc
	}
	return nil
}

func (m *ChromeOSConfig) GetFirmware() *ChromeOSConfig_Firmware {
	if m != nil {
		return m.Firmware
	}
	return nil
}

func (m *ChromeOSConfig) GetFirmwareSigning() *ChromeOSConfig_FirmwareSigning {
	if m != nil {
		return m.FirmwareSigning
	}
	return nil
}

func (m *ChromeOSConfig) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *ChromeOSConfig) GetBrandCode() string {
	if m != nil {
		return m.BrandCode
	}
	return ""
}

type ChromeOSConfig_Arc struct {
	BuildProperties      *ChromeOSConfig_Arc_BuildProperties `protobuf:"bytes,1,opt,name=build_properties,json=build-properties,proto3" json:"build_properties,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                            `json:"-"`
	XXX_unrecognized     []byte                              `json:"-"`
	XXX_sizecache        int32                               `json:"-"`
}

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

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

var xxx_messageInfo_ChromeOSConfig_Arc proto.InternalMessageInfo

func (m *ChromeOSConfig_Arc) GetBuildProperties() *ChromeOSConfig_Arc_BuildProperties {
	if m != nil {
		return m.BuildProperties
	}
	return nil
}

type ChromeOSConfig_Arc_BuildProperties struct {
	// Device name to report in ‘ro.product.device’. This is often
	// ‘{product}_cheets’ but it can be something else if desired.
	Device string `protobuf:"bytes,1,opt,name=device,proto3" json:"device,omitempty"`
	// The first Android API level that this model shipped with.
	FirstApiLevel string `protobuf:"bytes,2,opt,name=first_api_level,json=first-api-level,proto3" json:"first_api_level,omitempty"`
	// Name of this model as it is called in the market, reported in
	// ‘ro.product.model’. This often starts with ‘{oem}’.
	MarketingName string `protobuf:"bytes,3,opt,name=marketing_name,json=marketing-name,proto3" json:"marketing_name,omitempty"`
	// Tag to use to track metrics for this model. The tag can be shared
	// across many devices if desired, but this will result in larger
	// granularity for metrics reporting. Ideally the metrics system should
	// support collation of metrics with different tags into groups, but if
	// this is not supported, this tag can be used to achieve the same end.
	// This is reported in ‘ro.product.metrics.tag’.
	MetricsTag string `protobuf:"bytes,4,opt,name=metrics_tag,json=metrics-tag,proto3" json:"metrics_tag,omitempty"`
	// Original Equipment Manufacturer for this model. This generally means
	// the OEM name printed on the device.
	Oem        string `protobuf:"bytes,5,opt,name=oem,proto3" json:"oem,omitempty"`
	PaiRegions string `protobuf:"bytes,6,opt,name=pai_regions,json=pai-regions,proto3" json:"pai_regions,omitempty"`
	// Product name to report in ‘ro.product.name’. This may be the device
	// name, or it can be something else, to allow several devices to be
	// grouped into one product.
	Product              string   `protobuf:"bytes,7,opt,name=product,proto3" json:"product,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ChromeOSConfig_Arc_BuildProperties proto.InternalMessageInfo

func (m *ChromeOSConfig_Arc_BuildProperties) GetDevice() string {
	if m != nil {
		return m.Device
	}
	return ""
}

func (m *ChromeOSConfig_Arc_BuildProperties) GetFirstApiLevel() string {
	if m != nil {
		return m.FirstApiLevel
	}
	return ""
}

func (m *ChromeOSConfig_Arc_BuildProperties) GetMarketingName() string {
	if m != nil {
		return m.MarketingName
	}
	return ""
}

func (m *ChromeOSConfig_Arc_BuildProperties) GetMetricsTag() string {
	if m != nil {
		return m.MetricsTag
	}
	return ""
}

func (m *ChromeOSConfig_Arc_BuildProperties) GetOem() string {
	if m != nil {
		return m.Oem
	}
	return ""
}

func (m *ChromeOSConfig_Arc_BuildProperties) GetPaiRegions() string {
	if m != nil {
		return m.PaiRegions
	}
	return ""
}

func (m *ChromeOSConfig_Arc_BuildProperties) GetProduct() string {
	if m != nil {
		return m.Product
	}
	return ""
}

type ChromeOSConfig_Firmware struct {
	// BCS overlay path used to determine BCS file path for binary firmware
	// downloads.
	BcsOverlay string `protobuf:"bytes,1,opt,name=bcs_overlay,json=bcs-overlay,proto3" json:"bcs_overlay,omitempty"`
	// The name of the firmware build. Typically the device name, but can differ
	// when a device may have two or more different firmware builds.
	BuildName    string                                `protobuf:"bytes,2,opt,name=build_name,json=build-name,proto3" json:"build_name,omitempty"`
	BuildTargets *ChromeOSConfig_Firmware_BuildTargets `protobuf:"bytes,3,opt,name=build_targets,json=build-targets,proto3" json:"build_targets,omitempty"`
	// Name of the file located in BCS under the respective bcs-overlay.
	EcRoImage string `protobuf:"bytes,4,opt,name=ec_ro_image,json=ec-ro-image,proto3" json:"ec_ro_image,omitempty"`
	// Name of the file located in BCS under the respective bcs-overlay.
	MainRoImage string `protobuf:"bytes,5,opt,name=main_ro_image,json=main-ro-image,proto3" json:"main_ro_image,omitempty"`
	// Name of the file located in BCS under the respective bcs-overlay.
	MainRwImage string `protobuf:"bytes,6,opt,name=main_rw_image,json=main-rw-image,proto3" json:"main_rw_image,omitempty"`
	// This is a human-recognizable name used to refer to the firmware. It will
	// be used when generating the shellball via firmware packer. Mainly, this
	// is only for compatibility testing with device tree (since DT allowed
	// firmwares to be named).
	Name string `protobuf:"bytes,7,opt,name=name,proto3" json:"name,omitempty"`
	// If present this indicates that this model has no firmware at present.
	// This means that it will be omitted from the firmware updater
	// (chromeos-firmware- ebuild) and it will not be included in the signer
	// instructions file sent to the signer. This option is often useful when a
	// model is first added, since it may not have firmware at that point.
	NoFirmware bool `protobuf:"varint,8,opt,name=no_firmware,json=no-firmware,proto3" json:"no_firmware,omitempty"`
	// Name of the file located in BCS under the respective bcs-overlay.
	PdRoImage            string   `protobuf:"bytes,9,opt,name=pd_ro_image,json=pd-ro-image,proto3" json:"pd_ro_image,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ChromeOSConfig_Firmware proto.InternalMessageInfo

func (m *ChromeOSConfig_Firmware) GetBcsOverlay() string {
	if m != nil {
		return m.BcsOverlay
	}
	return ""
}

func (m *ChromeOSConfig_Firmware) GetBuildName() string {
	if m != nil {
		return m.BuildName
	}
	return ""
}

func (m *ChromeOSConfig_Firmware) GetBuildTargets() *ChromeOSConfig_Firmware_BuildTargets {
	if m != nil {
		return m.BuildTargets
	}
	return nil
}

func (m *ChromeOSConfig_Firmware) GetEcRoImage() string {
	if m != nil {
		return m.EcRoImage
	}
	return ""
}

func (m *ChromeOSConfig_Firmware) GetMainRoImage() string {
	if m != nil {
		return m.MainRoImage
	}
	return ""
}

func (m *ChromeOSConfig_Firmware) GetMainRwImage() string {
	if m != nil {
		return m.MainRwImage
	}
	return ""
}

func (m *ChromeOSConfig_Firmware) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *ChromeOSConfig_Firmware) GetNoFirmware() bool {
	if m != nil {
		return m.NoFirmware
	}
	return false
}

func (m *ChromeOSConfig_Firmware) GetPdRoImage() string {
	if m != nil {
		return m.PdRoImage
	}
	return ""
}

type ChromeOSConfig_Firmware_BuildTargets struct {
	// Build target of the base EC firmware for a detachable device, that will
	// be considered dirty when building/testing
	Base string `protobuf:"bytes,1,opt,name=base,proto3" json:"base,omitempty"`
	// Build target that will be considered dirty when building/testing
	// locally.
	Coreboot string `protobuf:"bytes,2,opt,name=coreboot,proto3" json:"coreboot,omitempty"`
	// Build target that will be considered dirty when building/testing
	// locally.
	Cr50 string `protobuf:"bytes,3,opt,name=cr50,proto3" json:"cr50,omitempty"`
	// Build target that will be considered dirty when building/testing
	// locally.
	Depthcharge string `protobuf:"bytes,4,opt,name=depthcharge,proto3" json:"depthcharge,omitempty"`
	// Build target that will be considered dirty when building/testing
	// locally.
	Ec string `protobuf:"bytes,5,opt,name=ec,proto3" json:"ec,omitempty"`
	// Extra EC build targets to build within chromeos-ec.
	EcExtras []string `protobuf:"bytes,6,rep,name=ec_extras,json=ecExtras,proto3" json:"ec_extras,omitempty"`
	// Build target that will be considered dirty when building/testing
	// locally.
	Ish string `protobuf:"bytes,7,opt,name=ish,proto3" json:"ish,omitempty"`
	// Build target that will be considered dirty when building/testing
	// locally.
	Libpayload string `protobuf:"bytes,8,opt,name=libpayload,proto3" json:"libpayload,omitempty"`
	// Build target that will be considered dirty when building/testing
	// locally.
	UBoot                string   `protobuf:"bytes,9,opt,name=u_boot,json=u-boot,proto3" json:"u_boot,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ChromeOSConfig_Firmware_BuildTargets proto.InternalMessageInfo

func (m *ChromeOSConfig_Firmware_BuildTargets) GetBase() string {
	if m != nil {
		return m.Base
	}
	return ""
}

func (m *ChromeOSConfig_Firmware_BuildTargets) GetCoreboot() string {
	if m != nil {
		return m.Coreboot
	}
	return ""
}

func (m *ChromeOSConfig_Firmware_BuildTargets) GetCr50() string {
	if m != nil {
		return m.Cr50
	}
	return ""
}

func (m *ChromeOSConfig_Firmware_BuildTargets) GetDepthcharge() string {
	if m != nil {
		return m.Depthcharge
	}
	return ""
}

func (m *ChromeOSConfig_Firmware_BuildTargets) GetEc() string {
	if m != nil {
		return m.Ec
	}
	return ""
}

func (m *ChromeOSConfig_Firmware_BuildTargets) GetEcExtras() []string {
	if m != nil {
		return m.EcExtras
	}
	return nil
}

func (m *ChromeOSConfig_Firmware_BuildTargets) GetIsh() string {
	if m != nil {
		return m.Ish
	}
	return ""
}

func (m *ChromeOSConfig_Firmware_BuildTargets) GetLibpayload() string {
	if m != nil {
		return m.Libpayload
	}
	return ""
}

func (m *ChromeOSConfig_Firmware_BuildTargets) GetUBoot() string {
	if m != nil {
		return m.UBoot
	}
	return ""
}

type ChromeOSConfig_FirmwareSigning struct {
	// Key ID from the signer key set that is used to sign the given firmware
	// image.
	KeyId string `protobuf:"bytes,1,opt,name=key_id,json=key-id,proto3" json:"key_id,omitempty"`
	//   Indicates that this model cannot be decoded by the mapping table.
	//   Instead the model is stored in the VPD (Vital Product Data) region in
	//   the customization_id property. This allows us to determine the model to
	//   use in the factory during the finalization stage. Note that if the VPD
	//   is wiped then the model will be lost. This may mean that the device
	//   will revert back to a generic model, or may not work. It is not
	//   possible in general to test whether the model in the VPD is correct at
	//   run-time. We simply assume that it is. The advantage of using this
	//   property is that no hardware changes are needed to change one model
	//   into another. For example we can create 20 different whitelabel boards,
	//   all with the same hardware, just by changing the customization_id that
	//   is written into SPI flash.
	SigIdInCustomizationId bool `protobuf:"varint,2,opt,name=sig_id_in_customization_id,json=sig-id-in-customization-id,proto3" json:"sig_id_in_customization_id,omitempty"`
	// ID used to generate keys/keyblocks in the firmware signing output. This
	// is also the value provided to mosys platform signature for the
	// updater4.sh script.
	SignatureId          string   `protobuf:"bytes,3,opt,name=signature_id,json=signature-id,proto3" json:"signature_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ChromeOSConfig_FirmwareSigning proto.InternalMessageInfo

func (m *ChromeOSConfig_FirmwareSigning) GetKeyId() string {
	if m != nil {
		return m.KeyId
	}
	return ""
}

func (m *ChromeOSConfig_FirmwareSigning) GetSigIdInCustomizationId() bool {
	if m != nil {
		return m.SigIdInCustomizationId
	}
	return false
}

func (m *ChromeOSConfig_FirmwareSigning) GetSignatureId() string {
	if m != nil {
		return m.SignatureId
	}
	return ""
}

// Defines attributes that are used by cros_config to detect the identity of
// the platform and which corresponding config should be used.
type ChromeOSConfig_Identity struct {
	// ‘customization_id’ value set in the VPD for non-unibuild Zergs and
	// Whitelabels. Deprecated for use in new products since 2017/07/26.
	CustomizationId string `protobuf:"bytes,1,opt,name=customization_id,json=customization-id,proto3" json:"customization_id,omitempty"`
	// Defines the name that is reported by ‘mosys platform name’ This is
	// typically the reference design name with the first letter capitalized.
	PlatformName string `protobuf:"bytes,2,opt,name=platform_name,json=platform-name,proto3" json:"platform_name,omitempty"`
	// SKU/Board strapping pins configured during board manufacturing. Minimum
	// value: -0x1. Maximum value: 0x7fffffff.
	SkuId int64 `protobuf:"varint,3,opt,name=sku_id,json=sku-id,proto3" json:"sku_id,omitempty"`
	// [x86] Firmware name built into the firmware and reflected back out in the
	// SMBIOS tables.
	SmbiosNameMatch string `protobuf:"bytes,4,opt,name=smbios_name_match,json=smbios-name-match,proto3" json:"smbios_name_match,omitempty"`
	// [ARM] String pattern (partial) that is matched against the contents of
	// /proc/device-tree/compatible on ARM devices.
	DeviceTreeCompatibleMatch string `protobuf:"bytes,5,opt,name=device_tree_compatible_match,json=device-tree-compatible-match,proto3" json:"device_tree_compatible_match,omitempty"`
	// ‘whitelabel_tag’ value set in the VPD, to add Whitelabel branding over an
	// unbranded base model.
	WhitelabelTag        string   `protobuf:"bytes,6,opt,name=whitelabel_tag,json=whitelabel-tag,proto3" json:"whitelabel_tag,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ChromeOSConfig_Identity proto.InternalMessageInfo

func (m *ChromeOSConfig_Identity) GetCustomizationId() string {
	if m != nil {
		return m.CustomizationId
	}
	return ""
}

func (m *ChromeOSConfig_Identity) GetPlatformName() string {
	if m != nil {
		return m.PlatformName
	}
	return ""
}

func (m *ChromeOSConfig_Identity) GetSkuId() int64 {
	if m != nil {
		return m.SkuId
	}
	return 0
}

func (m *ChromeOSConfig_Identity) GetSmbiosNameMatch() string {
	if m != nil {
		return m.SmbiosNameMatch
	}
	return ""
}

func (m *ChromeOSConfig_Identity) GetDeviceTreeCompatibleMatch() string {
	if m != nil {
		return m.DeviceTreeCompatibleMatch
	}
	return ""
}

func (m *ChromeOSConfig_Identity) GetWhitelabelTag() string {
	if m != nil {
		return m.WhitelabelTag
	}
	return ""
}

// All ChromeOS Config payloads for a given build.
type ChromeOSConfigs struct {
	Configs              []*ChromeOSConfig `protobuf:"bytes,1,rep,name=configs,proto3" json:"configs,omitempty"`
	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
	XXX_unrecognized     []byte            `json:"-"`
	XXX_sizecache        int32             `json:"-"`
}

func (m *ChromeOSConfigs) Reset()         { *m = ChromeOSConfigs{} }
func (m *ChromeOSConfigs) String() string { return proto.CompactTextString(m) }
func (*ChromeOSConfigs) ProtoMessage()    {}
func (*ChromeOSConfigs) Descriptor() ([]byte, []int) {
	return fileDescriptor_966966d4820ace27, []int{1}
}

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

var xxx_messageInfo_ChromeOSConfigs proto.InternalMessageInfo

func (m *ChromeOSConfigs) GetConfigs() []*ChromeOSConfig {
	if m != nil {
		return m.Configs
	}
	return nil
}

func init() {
	proto.RegisterType((*ChromeOSConfig)(nil), "build_config.ChromeOSConfig")
	proto.RegisterType((*ChromeOSConfig_Arc)(nil), "build_config.ChromeOSConfig.Arc")
	proto.RegisterType((*ChromeOSConfig_Arc_BuildProperties)(nil), "build_config.ChromeOSConfig.Arc.BuildProperties")
	proto.RegisterType((*ChromeOSConfig_Firmware)(nil), "build_config.ChromeOSConfig.Firmware")
	proto.RegisterType((*ChromeOSConfig_Firmware_BuildTargets)(nil), "build_config.ChromeOSConfig.Firmware.BuildTargets")
	proto.RegisterType((*ChromeOSConfig_FirmwareSigning)(nil), "build_config.ChromeOSConfig.FirmwareSigning")
	proto.RegisterType((*ChromeOSConfig_Identity)(nil), "build_config.ChromeOSConfig.Identity")
	proto.RegisterType((*ChromeOSConfigs)(nil), "build_config.ChromeOSConfigs")
}

func init() { proto.RegisterFile("build/build_config.proto", fileDescriptor_966966d4820ace27) }

var fileDescriptor_966966d4820ace27 = []byte{
	// 832 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x55, 0xcd, 0x8e, 0x23, 0x35,
	0x10, 0x56, 0x92, 0x21, 0x93, 0x54, 0xe6, 0x27, 0xf8, 0xb0, 0x6a, 0x85, 0x15, 0x8a, 0x46, 0xcb,
	0x2a, 0x42, 0xeb, 0x61, 0x35, 0x08, 0x8e, 0x48, 0xb3, 0x2b, 0x90, 0xf6, 0x04, 0xea, 0xe5, 0xb0,
	0x07, 0x24, 0xcb, 0xed, 0xae, 0x74, 0xac, 0xe9, 0x6e, 0xb7, 0xdc, 0xce, 0x0c, 0xe1, 0x1d, 0xe0,
	0x41, 0x78, 0x1b, 0xae, 0xbc, 0x02, 0x2f, 0x81, 0xca, 0x76, 0x27, 0x9d, 0x5d, 0xb4, 0xcc, 0x25,
	0xb2, 0x3f, 0x7f, 0xf5, 0x55, 0xfb, 0xab, 0x72, 0x05, 0x92, 0x6c, 0xab, 0xcb, 0xfc, 0x2b, 0xff,
	0x2b, 0x94, 0xa9, 0xd7, 0xba, 0xb8, 0x6e, 0xac, 0x71, 0x86, 0x9d, 0xf5, 0xb1, 0xab, 0x3f, 0xcf,
	0xe1, 0xe2, 0xf5, 0xc6, 0x9a, 0x0a, 0x7f, 0x7c, 0xfb, 0xda, 0x43, 0xec, 0x16, 0x26, 0x3a, 0xc7,
	0xda, 0x69, 0xb7, 0x4b, 0x06, 0xcb, 0xc1, 0x6a, 0x76, 0xf3, 0xc5, 0xf5, 0x91, 0xce, 0x31, 0xff,
	0xfa, 0x4d, 0x24, 0xa7, 0xfb, 0x30, 0x76, 0x03, 0x23, 0x69, 0x55, 0x32, 0xf4, 0xd1, 0xcb, 0x8f,
	0x46, 0xdf, 0x5a, 0x95, 0x12, 0x99, 0xd2, 0xae, 0xb5, 0xad, 0x1e, 0xa4, 0xc5, 0x64, 0xf4, 0x88,
	0xb4, 0x3f, 0x44, 0x72, 0xba, 0x0f, 0x63, 0xef, 0x60, 0xde, 0xad, 0x45, 0xab, 0x8b, 0x5a, 0xd7,
	0x45, 0x72, 0xe2, 0xa5, 0x5e, 0x3c, 0x4a, 0xea, 0x6d, 0x88, 0x49, 0xf7, 0x2a, 0x3c, 0xaa, 0x30,
	0x06, 0x27, 0xb5, 0xac, 0x30, 0xf9, 0x64, 0x39, 0x58, 0x4d, 0x53, 0xbf, 0x66, 0x9f, 0x03, 0x64,
	0x56, 0xd6, 0x24, 0x9a, 0x63, 0x32, 0xf6, 0x27, 0x01, 0xe1, 0x84, 0x2c, 0xfe, 0x1a, 0xc2, 0xe8,
	0xd6, 0x2a, 0xf6, 0x0b, 0xcc, 0x43, 0xf2, 0xc6, 0x9a, 0x06, 0xad, 0xd3, 0xd8, 0x46, 0x5f, 0x5f,
	0xfe, 0x9f, 0x33, 0xd7, 0xaf, 0xe8, 0xfc, 0xa7, 0x7d, 0x5c, 0x1a, 0x94, 0xf8, 0x41, 0x69, 0xf1,
	0xcf, 0x00, 0x2e, 0xdf, 0x63, 0xb1, 0x27, 0x30, 0xce, 0xf1, 0x5e, 0x2b, 0xf4, 0x79, 0xa6, 0x69,
	0xdc, 0xb1, 0x15, 0x5c, 0xae, 0xb5, 0x6d, 0x9d, 0x90, 0x8d, 0x16, 0x25, 0xde, 0x63, 0xe9, 0x4b,
	0x34, 0x4d, 0x03, 0xcc, 0x65, 0xa3, 0xb9, 0x87, 0xd9, 0x73, 0xb8, 0xa8, 0xa4, 0xbd, 0x43, 0xa7,
	0xeb, 0x42, 0xf8, 0x9b, 0x8f, 0x3c, 0xf1, 0x80, 0x72, 0xef, 0xc1, 0x12, 0x66, 0x15, 0x3a, 0xab,
	0x55, 0x2b, 0x9c, 0x0c, 0x66, 0x4f, 0xd3, 0x0e, 0xe2, 0x4e, 0x16, 0x6c, 0x0e, 0x23, 0x83, 0x55,
	0x34, 0x8e, 0x96, 0x14, 0xd3, 0x48, 0x2d, 0x2c, 0x16, 0xda, 0xd4, 0x6d, 0x34, 0x8e, 0x20, 0x1e,
	0x21, 0x96, 0xc0, 0x69, 0x63, 0x4d, 0xbe, 0x55, 0x2e, 0x39, 0xf5, 0xa7, 0xdd, 0x76, 0xf1, 0xf7,
	0x09, 0x4c, 0xba, 0x6a, 0x91, 0x50, 0xa6, 0x5a, 0x61, 0xee, 0xd1, 0x96, 0x72, 0x17, 0xef, 0x4a,
	0x10, 0x8f, 0x90, 0x2f, 0x91, 0x77, 0xd8, 0x5f, 0x61, 0x18, 0x4b, 0xe4, 0x2d, 0xf4, 0x9f, 0xff,
	0x0e, 0xce, 0xc3, 0xb9, 0x93, 0xb6, 0x40, 0xd7, 0xc6, 0xc6, 0xbb, 0x79, 0x54, 0xb7, 0x84, 0xe2,
	0xfc, 0x1c, 0x22, 0xd3, 0x20, 0xc4, 0xa3, 0x10, 0x7d, 0x1b, 0x2a, 0x61, 0x8d, 0xd0, 0x95, 0x2c,
	0xb0, 0x33, 0x06, 0x15, 0xb7, 0x86, 0x7b, 0x88, 0x3d, 0x83, 0xf3, 0x4a, 0xea, 0xfa, 0xc0, 0x09,
	0x16, 0x79, 0xf0, 0x3f, 0x58, 0x0f, 0x91, 0x35, 0xee, 0xb3, 0x1e, 0x22, 0xab, 0x6b, 0xcf, 0xd3,
	0x5e, 0x7b, 0x2e, 0x61, 0x56, 0x1b, 0xb1, 0x7f, 0x52, 0x93, 0xe5, 0x60, 0x35, 0x49, 0x67, 0xb5,
	0xe1, 0xeb, 0x9e, 0x7f, 0x4d, 0x7e, 0xc8, 0x3f, 0x8d, 0x85, 0xc8, 0xf7, 0xd9, 0xa9, 0xb9, 0xce,
	0xfa, 0xb7, 0xa4, 0x44, 0x99, 0x6c, 0xbb, 0xbe, 0xf2, 0x6b, 0xb6, 0x80, 0x89, 0x32, 0x16, 0x33,
	0x63, 0x5c, 0xb4, 0x78, 0xbf, 0x27, 0xbe, 0xb2, 0xdf, 0xbc, 0x8c, 0xdd, 0xe3, 0xd7, 0x94, 0x36,
	0xc7, 0xc6, 0x6d, 0xd4, 0x86, 0x44, 0x3b, 0x6b, 0x7a, 0x10, 0xbb, 0x80, 0x21, 0xaa, 0xe8, 0xc7,
	0x10, 0x15, 0xfb, 0x0c, 0xa6, 0xa8, 0x04, 0xfe, 0xea, 0xac, 0xa4, 0x7e, 0x19, 0x51, 0x0a, 0x54,
	0xdf, 0xfb, 0x3d, 0x35, 0x98, 0x6e, 0x37, 0xf1, 0xea, 0xb4, 0xa4, 0xaa, 0x97, 0x3a, 0x6b, 0xe4,
	0xae, 0x34, 0x32, 0xf7, 0x17, 0x9f, 0xa6, 0x3d, 0x84, 0x9e, 0xc7, 0x56, 0xf8, 0xcf, 0x0d, 0x57,
	0x1e, 0x6f, 0x39, 0xed, 0x16, 0xbf, 0x0f, 0xe0, 0xf2, 0xbd, 0x51, 0x40, 0xdc, 0x3b, 0xdc, 0x09,
	0x9d, 0x77, 0x4f, 0xe9, 0x0e, 0x77, 0x5c, 0xe7, 0xec, 0x3b, 0x58, 0xb4, 0xba, 0x10, 0x3a, 0x17,
	0xba, 0x16, 0x6a, 0xdb, 0x3a, 0x53, 0xe9, 0xdf, 0xa4, 0xd3, 0xa6, 0x26, 0xee, 0xd0, 0x9b, 0x4d,
	0x0c, 0xae, 0x73, 0xae, 0x6b, 0x7e, 0xc4, 0xa0, 0xf8, 0x2b, 0x38, 0xa3, 0xd9, 0x22, 0xdd, 0xd6,
	0x22, 0x45, 0x04, 0x83, 0x0e, 0x18, 0xd7, 0xf9, 0xe2, 0x8f, 0x21, 0x4c, 0xba, 0xe1, 0xca, 0xbe,
	0x84, 0xf9, 0x07, 0x69, 0xc2, 0x27, 0xcd, 0x3f, 0x10, 0x7f, 0x06, 0xe7, 0x4d, 0x29, 0xdd, 0xda,
	0xd8, 0xaa, 0xdf, 0xf9, 0x7b, 0x30, 0x34, 0xff, 0x13, 0x18, 0xb7, 0x77, 0xdb, 0x2e, 0xf9, 0x28,
	0xa5, 0x1d, 0x45, 0xbf, 0x80, 0x4f, 0xdb, 0x2a, 0xd3, 0xa6, 0xf5, 0xb1, 0xa2, 0x92, 0x4e, 0x6d,
	0x62, 0x95, 0xe2, 0x81, 0x8f, 0xe7, 0xfe, 0x80, 0xbd, 0x82, 0xa7, 0x61, 0xba, 0x08, 0x67, 0x11,
	0x85, 0x32, 0x55, 0x23, 0x9d, 0xce, 0xca, 0x2e, 0x30, 0x54, 0x31, 0x72, 0x38, 0x71, 0xf8, 0x81,
	0x13, 0x35, 0x9e, 0xc3, 0xc5, 0xc3, 0x46, 0x3b, 0x2c, 0x65, 0x86, 0xa5, 0x1f, 0x24, 0xa1, 0xcb,
	0x7b, 0x28, 0xcd, 0x92, 0xab, 0x37, 0x70, 0x79, 0xfc, 0x16, 0x5b, 0xf6, 0x2d, 0x9c, 0x86, 0x57,
	0x4a, 0x33, 0x75, 0xb4, 0x9a, 0xdd, 0x3c, 0xfd, 0xd8, 0xdb, 0x4d, 0x3b, 0x72, 0x36, 0xf6, 0x7f,
	0x86, 0x5f, 0xff, 0x1b, 0x00, 0x00, 0xff, 0xff, 0xe9, 0x64, 0x81, 0x6c, 0x28, 0x07, 0x00, 0x00,
}
