// Copyright 2020 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.25.0-devel
// 	protoc        v3.6.1
// source: chromiumos/ge_config.proto

package chromiumos

import (
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
	reflect "reflect"
	sync "sync"
)

const (
	// Verify that this generated code is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
	// Verify that runtime/protoimpl is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)

// Enum for various type of builders
type BuilderType int32

const (
	BuilderType_UNKNOWN_BUILDER_TYPE BuilderType = 0
	BuilderType_RELEASE              BuilderType = 1
)

// Enum value maps for BuilderType.
var (
	BuilderType_name = map[int32]string{
		0: "UNKNOWN_BUILDER_TYPE",
		1: "RELEASE",
	}
	BuilderType_value = map[string]int32{
		"UNKNOWN_BUILDER_TYPE": 0,
		"RELEASE":              1,
	}
)

func (x BuilderType) Enum() *BuilderType {
	p := new(BuilderType)
	*p = x
	return p
}

func (x BuilderType) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (BuilderType) Descriptor() protoreflect.EnumDescriptor {
	return file_chromiumos_ge_config_proto_enumTypes[0].Descriptor()
}

func (BuilderType) Type() protoreflect.EnumType {
	return &file_chromiumos_ge_config_proto_enumTypes[0]
}

func (x BuilderType) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use BuilderType.Descriptor instead.
func (BuilderType) EnumDescriptor() ([]byte, []int) {
	return file_chromiumos_ge_config_proto_rawDescGZIP(), []int{0}
}

type Architecture int32

const (
	Architecture_UNKNOWN      Architecture = 0
	Architecture_X86_INTERNAL Architecture = 1
	Architecture_ARM_INTERNAL Architecture = 2
)

// Enum value maps for Architecture.
var (
	Architecture_name = map[int32]string{
		0: "UNKNOWN",
		1: "X86_INTERNAL",
		2: "ARM_INTERNAL",
	}
	Architecture_value = map[string]int32{
		"UNKNOWN":      0,
		"X86_INTERNAL": 1,
		"ARM_INTERNAL": 2,
	}
)

func (x Architecture) Enum() *Architecture {
	p := new(Architecture)
	*p = x
	return p
}

func (x Architecture) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (Architecture) Descriptor() protoreflect.EnumDescriptor {
	return file_chromiumos_ge_config_proto_enumTypes[1].Descriptor()
}

func (Architecture) Type() protoreflect.EnumType {
	return &file_chromiumos_ge_config_proto_enumTypes[1]
}

func (x Architecture) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use Architecture.Descriptor instead.
func (Architecture) EnumDescriptor() ([]byte, []int) {
	return file_chromiumos_ge_config_proto_rawDescGZIP(), []int{1}
}

type Model struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The board name for this model.
	BoardName string `protobuf:"bytes,1,opt,name=board_name,json=boardName,proto3" json:"board_name,omitempty"`
	// The name of the model.
	Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
	// Defines which test suites should actually be run for a given model
	// when the release builder is setting up the hardware tests.
	TestSuites []string `protobuf:"bytes,3,rep,name=test_suites,json=testSuites,proto3" json:"test_suites,omitempty"`
	// Defines whether presubmit hardware tests should be run against a given
	// model as part of the commit queue.
	CqTestEnabled bool `protobuf:"varint,4,opt,name=cq_test_enabled,json=cqTestEnabled,proto3" json:"cq_test_enabled,omitempty"`
	// Defines the test pool that will be scheduled against for any HW tests
	// executed against the given model.
	ReleaseBuilderTestPool string `protobuf:"bytes,5,opt,name=release_builder_test_pool,json=releaseBuilderTestPool,proto3" json:"release_builder_test_pool,omitempty"`
	// The GoldenEye ID for the board of this model.
	// If the board does not exist, the field value will be 0.
	BoardId  int64 `protobuf:"varint,6,opt,name=board_id,json=boardId,proto3" json:"board_id,omitempty"`
	IsActive bool  `protobuf:"varint,7,opt,name=is_active,json=isActive,proto3" json:"is_active,omitempty"`
	// Hardware match for the model.
	HwidMatch string `protobuf:"bytes,8,opt,name=hwid_match,json=hwidMatch,proto3" json:"hwid_match,omitempty"`
}

func (x *Model) Reset() {
	*x = Model{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromiumos_ge_config_proto_msgTypes[0]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *Model) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*Model) ProtoMessage() {}

func (x *Model) ProtoReflect() protoreflect.Message {
	mi := &file_chromiumos_ge_config_proto_msgTypes[0]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use Model.ProtoReflect.Descriptor instead.
func (*Model) Descriptor() ([]byte, []int) {
	return file_chromiumos_ge_config_proto_rawDescGZIP(), []int{0}
}

func (x *Model) GetBoardName() string {
	if x != nil {
		return x.BoardName
	}
	return ""
}

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

func (x *Model) GetTestSuites() []string {
	if x != nil {
		return x.TestSuites
	}
	return nil
}

func (x *Model) GetCqTestEnabled() bool {
	if x != nil {
		return x.CqTestEnabled
	}
	return false
}

func (x *Model) GetReleaseBuilderTestPool() string {
	if x != nil {
		return x.ReleaseBuilderTestPool
	}
	return ""
}

func (x *Model) GetBoardId() int64 {
	if x != nil {
		return x.BoardId
	}
	return 0
}

func (x *Model) GetIsActive() bool {
	if x != nil {
		return x.IsActive
	}
	return false
}

func (x *Model) GetHwidMatch() string {
	if x != nil {
		return x.HwidMatch
	}
	return ""
}

// Configuration required by BuildBot in order to generate a unified release
// builder with the appropriate model specific hardware test coverage.
// For context, see: go/cros-unibuild-hw-test
type ReferenceBoardUnifiedBuildConfig struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The name of the build that will be created by BuildBot.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// The name of the reference board this unified build is based upon.
	ReferenceBoardName string `protobuf:"bytes,2,opt,name=reference_board_name,json=referenceBoardName,proto3" json:"reference_board_name,omitempty"`
	// The instruction set architecture of the reference board.
	Arch Architecture `protobuf:"varint,3,opt,name=arch,proto3,enum=chromiumos.Architecture" json:"arch,omitempty"`
	// Whether this is a release build or not.
	Builder BuilderType `protobuf:"varint,4,opt,name=builder,proto3,enum=chromiumos.BuilderType" json:"builder,omitempty"`
	// Whether this build is considered experimental only.
	Experimental bool `protobuf:"varint,5,opt,name=experimental,proto3" json:"experimental,omitempty"`
	// The list of models that are based on the given reference board
	// and supported as part of the unified build.
	Models []*Model `protobuf:"bytes,6,rep,name=models,proto3" json:"models,omitempty"`
}

func (x *ReferenceBoardUnifiedBuildConfig) Reset() {
	*x = ReferenceBoardUnifiedBuildConfig{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromiumos_ge_config_proto_msgTypes[1]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *ReferenceBoardUnifiedBuildConfig) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ReferenceBoardUnifiedBuildConfig) ProtoMessage() {}

func (x *ReferenceBoardUnifiedBuildConfig) ProtoReflect() protoreflect.Message {
	mi := &file_chromiumos_ge_config_proto_msgTypes[1]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ReferenceBoardUnifiedBuildConfig.ProtoReflect.Descriptor instead.
func (*ReferenceBoardUnifiedBuildConfig) Descriptor() ([]byte, []int) {
	return file_chromiumos_ge_config_proto_rawDescGZIP(), []int{1}
}

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

func (x *ReferenceBoardUnifiedBuildConfig) GetReferenceBoardName() string {
	if x != nil {
		return x.ReferenceBoardName
	}
	return ""
}

func (x *ReferenceBoardUnifiedBuildConfig) GetArch() Architecture {
	if x != nil {
		return x.Arch
	}
	return Architecture_UNKNOWN
}

func (x *ReferenceBoardUnifiedBuildConfig) GetBuilder() BuilderType {
	if x != nil {
		return x.Builder
	}
	return BuilderType_UNKNOWN_BUILDER_TYPE
}

func (x *ReferenceBoardUnifiedBuildConfig) GetExperimental() bool {
	if x != nil {
		return x.Experimental
	}
	return false
}

func (x *ReferenceBoardUnifiedBuildConfig) GetModels() []*Model {
	if x != nil {
		return x.Models
	}
	return nil
}

// Message to represent a build config for a given builder
type Config struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Builder      BuilderType  `protobuf:"varint,1,opt,name=builder,proto3,enum=chromiumos.BuilderType" json:"builder,omitempty"`
	Experimental bool         `protobuf:"varint,2,opt,name=experimental,proto3" json:"experimental,omitempty"`
	LeaderBoard  bool         `protobuf:"varint,3,opt,name=leader_board,json=leaderBoard,proto3" json:"leader_board,omitempty"`
	BoardGroup   string       `protobuf:"bytes,4,opt,name=board_group,json=boardGroup,proto3" json:"board_group,omitempty"`
	Arch         Architecture `protobuf:"varint,5,opt,name=arch,proto3,enum=chromiumos.Architecture" json:"arch,omitempty"`
}

func (x *Config) Reset() {
	*x = Config{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromiumos_ge_config_proto_msgTypes[2]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *Config) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*Config) ProtoMessage() {}

func (x *Config) ProtoReflect() protoreflect.Message {
	mi := &file_chromiumos_ge_config_proto_msgTypes[2]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use Config.ProtoReflect.Descriptor instead.
func (*Config) Descriptor() ([]byte, []int) {
	return file_chromiumos_ge_config_proto_rawDescGZIP(), []int{2}
}

func (x *Config) GetBuilder() BuilderType {
	if x != nil {
		return x.Builder
	}
	return BuilderType_UNKNOWN_BUILDER_TYPE
}

func (x *Config) GetExperimental() bool {
	if x != nil {
		return x.Experimental
	}
	return false
}

func (x *Config) GetLeaderBoard() bool {
	if x != nil {
		return x.LeaderBoard
	}
	return false
}

func (x *Config) GetBoardGroup() string {
	if x != nil {
		return x.BoardGroup
	}
	return ""
}

func (x *Config) GetArch() Architecture {
	if x != nil {
		return x.Arch
	}
	return Architecture_UNKNOWN
}

// Message to represent a board in build configuration
type BuildBoard struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Name    string    `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	Configs []*Config `protobuf:"bytes,2,rep,name=configs,proto3" json:"configs,omitempty"`
}

func (x *BuildBoard) Reset() {
	*x = BuildBoard{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromiumos_ge_config_proto_msgTypes[3]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *BuildBoard) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*BuildBoard) ProtoMessage() {}

func (x *BuildBoard) ProtoReflect() protoreflect.Message {
	mi := &file_chromiumos_ge_config_proto_msgTypes[3]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use BuildBoard.ProtoReflect.Descriptor instead.
func (*BuildBoard) Descriptor() ([]byte, []int) {
	return file_chromiumos_ge_config_proto_rawDescGZIP(), []int{3}
}

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

func (x *BuildBoard) GetConfigs() []*Config {
	if x != nil {
		return x.Configs
	}
	return nil
}

// Message to represent a build configuration.
// The JSON file from GE is this proto.
type GEConfig struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	MetadataVersion             string                              `protobuf:"bytes,1,opt,name=metadata_version,json=metadataVersion,proto3" json:"metadata_version,omitempty"`
	Boards                      []*BuildBoard                       `protobuf:"bytes,2,rep,name=boards,proto3" json:"boards,omitempty"`
	ReleaseBranch               bool                                `protobuf:"varint,3,opt,name=release_branch,json=releaseBranch,proto3" json:"release_branch,omitempty"`
	ReferenceBoardUnifiedBuilds []*ReferenceBoardUnifiedBuildConfig `protobuf:"bytes,4,rep,name=reference_board_unified_builds,json=referenceBoardUnifiedBuilds,proto3" json:"reference_board_unified_builds,omitempty"`
}

func (x *GEConfig) Reset() {
	*x = GEConfig{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromiumos_ge_config_proto_msgTypes[4]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *GEConfig) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*GEConfig) ProtoMessage() {}

func (x *GEConfig) ProtoReflect() protoreflect.Message {
	mi := &file_chromiumos_ge_config_proto_msgTypes[4]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use GEConfig.ProtoReflect.Descriptor instead.
func (*GEConfig) Descriptor() ([]byte, []int) {
	return file_chromiumos_ge_config_proto_rawDescGZIP(), []int{4}
}

func (x *GEConfig) GetMetadataVersion() string {
	if x != nil {
		return x.MetadataVersion
	}
	return ""
}

func (x *GEConfig) GetBoards() []*BuildBoard {
	if x != nil {
		return x.Boards
	}
	return nil
}

func (x *GEConfig) GetReleaseBranch() bool {
	if x != nil {
		return x.ReleaseBranch
	}
	return false
}

func (x *GEConfig) GetReferenceBoardUnifiedBuilds() []*ReferenceBoardUnifiedBuildConfig {
	if x != nil {
		return x.ReferenceBoardUnifiedBuilds
	}
	return nil
}

var File_chromiumos_ge_config_proto protoreflect.FileDescriptor

var file_chromiumos_ge_config_proto_rawDesc = []byte{
	0x0a, 0x1a, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2f, 0x67, 0x65, 0x5f,
	0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0a, 0x63, 0x68,
	0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x22, 0x95, 0x02, 0x0a, 0x05, 0x4d, 0x6f, 0x64,
	0x65, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65,
	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x4e, 0x61, 0x6d,
	0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
	0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x73, 0x75,
	0x69, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x65, 0x73, 0x74,
	0x53, 0x75, 0x69, 0x74, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x63, 0x71, 0x5f, 0x74, 0x65, 0x73,
	0x74, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52,
	0x0d, 0x63, 0x71, 0x54, 0x65, 0x73, 0x74, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x39,
	0x0a, 0x19, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x65,
	0x72, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28,
	0x09, 0x52, 0x16, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65,
	0x72, 0x54, 0x65, 0x73, 0x74, 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x19, 0x0a, 0x08, 0x62, 0x6f, 0x61,
	0x72, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x62, 0x6f, 0x61,
	0x72, 0x64, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x73, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76,
	0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x41, 0x63, 0x74, 0x69, 0x76,
	0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x68, 0x77, 0x69, 0x64, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18,
	0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x68, 0x77, 0x69, 0x64, 0x4d, 0x61, 0x74, 0x63, 0x68,
	0x22, 0x98, 0x02, 0x0a, 0x20, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x42, 0x6f,
	0x61, 0x72, 0x64, 0x55, 0x6e, 0x69, 0x66, 0x69, 0x65, 0x64, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x43,
	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20,
	0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x72, 0x65, 0x66,
	0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x6e, 0x61, 0x6d,
	0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e,
	0x63, 0x65, 0x42, 0x6f, 0x61, 0x72, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2c, 0x0a, 0x04, 0x61,
	0x72, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x63, 0x68, 0x72, 0x6f,
	0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74,
	0x75, 0x72, 0x65, 0x52, 0x04, 0x61, 0x72, 0x63, 0x68, 0x12, 0x31, 0x0a, 0x07, 0x62, 0x75, 0x69,
	0x6c, 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x68, 0x72,
	0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x54,
	0x79, 0x70, 0x65, 0x52, 0x07, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x12, 0x22, 0x0a, 0x0c,
	0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x18, 0x05, 0x20, 0x01,
	0x28, 0x08, 0x52, 0x0c, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c,
	0x12, 0x29, 0x0a, 0x06, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b,
	0x32, 0x11, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x4d, 0x6f,
	0x64, 0x65, 0x6c, 0x52, 0x06, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x22, 0xd1, 0x01, 0x0a, 0x06,
	0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x31, 0x0a, 0x07, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x65,
	0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69,
	0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65,
	0x52, 0x07, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x12, 0x22, 0x0a, 0x0c, 0x65, 0x78, 0x70,
	0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52,
	0x0c, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x12, 0x21, 0x0a,
	0x0c, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x18, 0x03, 0x20,
	0x01, 0x28, 0x08, 0x52, 0x0b, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x42, 0x6f, 0x61, 0x72, 0x64,
	0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18,
	0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x47, 0x72, 0x6f, 0x75,
	0x70, 0x12, 0x2c, 0x0a, 0x04, 0x61, 0x72, 0x63, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32,
	0x18, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x72, 0x63,
	0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x52, 0x04, 0x61, 0x72, 0x63, 0x68, 0x22,
	0x4e, 0x0a, 0x0a, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x42, 0x6f, 0x61, 0x72, 0x64, 0x12, 0x12, 0x0a,
	0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d,
	0x65, 0x12, 0x2c, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03,
	0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e,
	0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x22,
	0xff, 0x01, 0x0a, 0x08, 0x47, 0x45, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x29, 0x0a, 0x10,
	0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e,
	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61,
	0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x06, 0x62, 0x6f, 0x61, 0x72, 0x64,
	0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69,
	0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x42, 0x6f, 0x61, 0x72, 0x64, 0x52,
	0x06, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x65, 0x6c, 0x65, 0x61,
	0x73, 0x65, 0x5f, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52,
	0x0d, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, 0x71,
	0x0a, 0x1e, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x62, 0x6f, 0x61, 0x72,
	0x64, 0x5f, 0x75, 0x6e, 0x69, 0x66, 0x69, 0x65, 0x64, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x73,
	0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75,
	0x6d, 0x6f, 0x73, 0x2e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x42, 0x6f, 0x61,
	0x72, 0x64, 0x55, 0x6e, 0x69, 0x66, 0x69, 0x65, 0x64, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x43, 0x6f,
	0x6e, 0x66, 0x69, 0x67, 0x52, 0x1b, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x42,
	0x6f, 0x61, 0x72, 0x64, 0x55, 0x6e, 0x69, 0x66, 0x69, 0x65, 0x64, 0x42, 0x75, 0x69, 0x6c, 0x64,
	0x73, 0x2a, 0x34, 0x0a, 0x0b, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65,
	0x12, 0x18, 0x0a, 0x14, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x42, 0x55, 0x49, 0x4c,
	0x44, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x45,
	0x4c, 0x45, 0x41, 0x53, 0x45, 0x10, 0x01, 0x2a, 0x3f, 0x0a, 0x0c, 0x41, 0x72, 0x63, 0x68, 0x69,
	0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f,
	0x57, 0x4e, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x58, 0x38, 0x36, 0x5f, 0x49, 0x4e, 0x54, 0x45,
	0x52, 0x4e, 0x41, 0x4c, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x41, 0x52, 0x4d, 0x5f, 0x49, 0x4e,
	0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x10, 0x02, 0x42, 0x36, 0x5a, 0x34, 0x67, 0x6f, 0x2e, 0x63,
	0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x63, 0x68, 0x72, 0x6f,
	0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2f, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x2f, 0x70, 0x72, 0x6f,
	0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73,
	0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_chromiumos_ge_config_proto_rawDescOnce sync.Once
	file_chromiumos_ge_config_proto_rawDescData = file_chromiumos_ge_config_proto_rawDesc
)

func file_chromiumos_ge_config_proto_rawDescGZIP() []byte {
	file_chromiumos_ge_config_proto_rawDescOnce.Do(func() {
		file_chromiumos_ge_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_chromiumos_ge_config_proto_rawDescData)
	})
	return file_chromiumos_ge_config_proto_rawDescData
}

var file_chromiumos_ge_config_proto_enumTypes = make([]protoimpl.EnumInfo, 2)
var file_chromiumos_ge_config_proto_msgTypes = make([]protoimpl.MessageInfo, 5)
var file_chromiumos_ge_config_proto_goTypes = []interface{}{
	(BuilderType)(0),                         // 0: chromiumos.BuilderType
	(Architecture)(0),                        // 1: chromiumos.Architecture
	(*Model)(nil),                            // 2: chromiumos.Model
	(*ReferenceBoardUnifiedBuildConfig)(nil), // 3: chromiumos.ReferenceBoardUnifiedBuildConfig
	(*Config)(nil),                           // 4: chromiumos.Config
	(*BuildBoard)(nil),                       // 5: chromiumos.BuildBoard
	(*GEConfig)(nil),                         // 6: chromiumos.GEConfig
}
var file_chromiumos_ge_config_proto_depIdxs = []int32{
	1, // 0: chromiumos.ReferenceBoardUnifiedBuildConfig.arch:type_name -> chromiumos.Architecture
	0, // 1: chromiumos.ReferenceBoardUnifiedBuildConfig.builder:type_name -> chromiumos.BuilderType
	2, // 2: chromiumos.ReferenceBoardUnifiedBuildConfig.models:type_name -> chromiumos.Model
	0, // 3: chromiumos.Config.builder:type_name -> chromiumos.BuilderType
	1, // 4: chromiumos.Config.arch:type_name -> chromiumos.Architecture
	4, // 5: chromiumos.BuildBoard.configs:type_name -> chromiumos.Config
	5, // 6: chromiumos.GEConfig.boards:type_name -> chromiumos.BuildBoard
	3, // 7: chromiumos.GEConfig.reference_board_unified_builds:type_name -> chromiumos.ReferenceBoardUnifiedBuildConfig
	8, // [8:8] is the sub-list for method output_type
	8, // [8:8] is the sub-list for method input_type
	8, // [8:8] is the sub-list for extension type_name
	8, // [8:8] is the sub-list for extension extendee
	0, // [0:8] is the sub-list for field type_name
}

func init() { file_chromiumos_ge_config_proto_init() }
func file_chromiumos_ge_config_proto_init() {
	if File_chromiumos_ge_config_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_chromiumos_ge_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Model); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromiumos_ge_config_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ReferenceBoardUnifiedBuildConfig); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromiumos_ge_config_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Config); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromiumos_ge_config_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*BuildBoard); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromiumos_ge_config_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*GEConfig); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_chromiumos_ge_config_proto_rawDesc,
			NumEnums:      2,
			NumMessages:   5,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_chromiumos_ge_config_proto_goTypes,
		DependencyIndexes: file_chromiumos_ge_config_proto_depIdxs,
		EnumInfos:         file_chromiumos_ge_config_proto_enumTypes,
		MessageInfos:      file_chromiumos_ge_config_proto_msgTypes,
	}.Build()
	File_chromiumos_ge_config_proto = out.File
	file_chromiumos_ge_config_proto_rawDesc = nil
	file_chromiumos_ge_config_proto_goTypes = nil
	file_chromiumos_ge_config_proto_depIdxs = nil
}
