// Code generated by protoc-gen-go. DO NOT EDIT.
// source: chromiumos/builder_config.proto

package chromiumos

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	timestamp "github.com/golang/protobuf/ptypes/timestamp"
	wrappers "github.com/golang/protobuf/ptypes/wrappers"
	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

// Used to control running of special steps.
type BuilderConfig_RunSpec int32

const (
	BuilderConfig_RUN_SPEC_UNSPECIFIED BuilderConfig_RunSpec = 0
	// Do not run.
	BuilderConfig_NO_RUN BuilderConfig_RunSpec = 1
	// Run.
	BuilderConfig_RUN BuilderConfig_RunSpec = 2
	// Run and then exit.
	BuilderConfig_RUN_EXIT BuilderConfig_RunSpec = 3
)

var BuilderConfig_RunSpec_name = map[int32]string{
	0: "RUN_SPEC_UNSPECIFIED",
	1: "NO_RUN",
	2: "RUN",
	3: "RUN_EXIT",
}

var BuilderConfig_RunSpec_value = map[string]int32{
	"RUN_SPEC_UNSPECIFIED": 0,
	"NO_RUN":               1,
	"RUN":                  2,
	"RUN_EXIT":             3,
}

func (x BuilderConfig_RunSpec) String() string {
	return proto.EnumName(BuilderConfig_RunSpec_name, int32(x))
}

func (BuilderConfig_RunSpec) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_6fe67302c16003fb, []int{0, 0}
}

// A rule describing which subset of dependencies should be used.
// When used in combination with a list of packages, the intersection of the
// two sets will be used.
type BuilderConfig_Dependencies int32

const (
	BuilderConfig_DEPENDENCIES_UNSPECIFIED BuilderConfig_Dependencies = 0
	// Use all dependencies.
	BuilderConfig_ALL_DEPENDENCIES BuilderConfig_Dependencies = 1
	// Only use dependencies affected by the changes applied to the build.
	BuilderConfig_CL_AFFECTED_DEPENDENCIES BuilderConfig_Dependencies = 2
)

var BuilderConfig_Dependencies_name = map[int32]string{
	0: "DEPENDENCIES_UNSPECIFIED",
	1: "ALL_DEPENDENCIES",
	2: "CL_AFFECTED_DEPENDENCIES",
}

var BuilderConfig_Dependencies_value = map[string]int32{
	"DEPENDENCIES_UNSPECIFIED": 0,
	"ALL_DEPENDENCIES":         1,
	"CL_AFFECTED_DEPENDENCIES": 2,
}

func (x BuilderConfig_Dependencies) String() string {
	return proto.EnumName(BuilderConfig_Dependencies_name, int32(x))
}

func (BuilderConfig_Dependencies) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_6fe67302c16003fb, []int{0, 1}
}

// Type of build.
type BuilderConfig_Id_Type int32

const (
	BuilderConfig_Id_TYPE_UNSPECIFIED BuilderConfig_Id_Type = 0
	// Commit queue build.
	BuilderConfig_Id_CQ BuilderConfig_Id_Type = 1
	// Postsubmit build.
	BuilderConfig_Id_POSTSUBMIT BuilderConfig_Id_Type = 2
	// Toolchain build.
	BuilderConfig_Id_TOOLCHAIN BuilderConfig_Id_Type = 3
	// Informational build.
	BuilderConfig_Id_INFORMATIONAL BuilderConfig_Id_Type = 4
	// Release build.
	BuilderConfig_Id_RELEASE BuilderConfig_Id_Type = 5
)

var BuilderConfig_Id_Type_name = map[int32]string{
	0: "TYPE_UNSPECIFIED",
	1: "CQ",
	2: "POSTSUBMIT",
	3: "TOOLCHAIN",
	4: "INFORMATIONAL",
	5: "RELEASE",
}

var BuilderConfig_Id_Type_value = map[string]int32{
	"TYPE_UNSPECIFIED": 0,
	"CQ":               1,
	"POSTSUBMIT":       2,
	"TOOLCHAIN":        3,
	"INFORMATIONAL":    4,
	"RELEASE":          5,
}

func (x BuilderConfig_Id_Type) String() string {
	return proto.EnumName(BuilderConfig_Id_Type_name, int32(x))
}

func (BuilderConfig_Id_Type) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_6fe67302c16003fb, []int{0, 0, 0}
}

type BuilderConfig_General_Environment int32

const (
	BuilderConfig_General_ENVIRONMENT_UNSPECIFIED BuilderConfig_General_Environment = 0
	BuilderConfig_General_PRODUCTION              BuilderConfig_General_Environment = 1
	BuilderConfig_General_STAGING                 BuilderConfig_General_Environment = 2
)

var BuilderConfig_General_Environment_name = map[int32]string{
	0: "ENVIRONMENT_UNSPECIFIED",
	1: "PRODUCTION",
	2: "STAGING",
}

var BuilderConfig_General_Environment_value = map[string]int32{
	"ENVIRONMENT_UNSPECIFIED": 0,
	"PRODUCTION":              1,
	"STAGING":                 2,
}

func (x BuilderConfig_General_Environment) String() string {
	return proto.EnumName(BuilderConfig_General_Environment_name, int32(x))
}

func (BuilderConfig_General_Environment) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_6fe67302c16003fb, []int{0, 1, 0}
}

// Indicates which manifest a builder should sync to.
type BuilderConfig_General_Manifest int32

const (
	BuilderConfig_General_MANIFEST_UNSPECIFIED BuilderConfig_General_Manifest = 0
	BuilderConfig_General_PUBLIC               BuilderConfig_General_Manifest = 1
	BuilderConfig_General_PRIVATE              BuilderConfig_General_Manifest = 2
)

var BuilderConfig_General_Manifest_name = map[int32]string{
	0: "MANIFEST_UNSPECIFIED",
	1: "PUBLIC",
	2: "PRIVATE",
}

var BuilderConfig_General_Manifest_value = map[string]int32{
	"MANIFEST_UNSPECIFIED": 0,
	"PUBLIC":               1,
	"PRIVATE":              2,
}

func (x BuilderConfig_General_Manifest) String() string {
	return proto.EnumName(BuilderConfig_General_Manifest_name, int32(x))
}

func (BuilderConfig_General_Manifest) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_6fe67302c16003fb, []int{0, 1, 1}
}

type BuilderConfig_General_RunWhen_Mode int32

const (
	BuilderConfig_General_RunWhen_MODE_UNSPECIFIED BuilderConfig_General_RunWhen_Mode = 0
	// Always run this builder. The file_patterns field will be ignored
	// when this mode is selected.
	BuilderConfig_General_RunWhen_ALWAYS_RUN BuilderConfig_General_RunWhen_Mode = 1
	// Only run this builder if any file in the input gerrit_changes
	// matches any file_pattern specified below. If file_patterns is empty,
	// this option implies the builder will never run.
	BuilderConfig_General_RunWhen_ONLY_RUN_ON_FILE_MATCH BuilderConfig_General_RunWhen_Mode = 2
	// Do not run the builder if all files in the input gerrit_changes
	// match any file_attern speicifed below. If file_patterns is empty,
	// this option implies the builder will always run.
	BuilderConfig_General_RunWhen_NO_RUN_ON_FILE_MATCH BuilderConfig_General_RunWhen_Mode = 3
)

var BuilderConfig_General_RunWhen_Mode_name = map[int32]string{
	0: "MODE_UNSPECIFIED",
	1: "ALWAYS_RUN",
	2: "ONLY_RUN_ON_FILE_MATCH",
	3: "NO_RUN_ON_FILE_MATCH",
}

var BuilderConfig_General_RunWhen_Mode_value = map[string]int32{
	"MODE_UNSPECIFIED":       0,
	"ALWAYS_RUN":             1,
	"ONLY_RUN_ON_FILE_MATCH": 2,
	"NO_RUN_ON_FILE_MATCH":   3,
}

func (x BuilderConfig_General_RunWhen_Mode) String() string {
	return proto.EnumName(BuilderConfig_General_RunWhen_Mode_name, int32(x))
}

func (BuilderConfig_General_RunWhen_Mode) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_6fe67302c16003fb, []int{0, 1, 0, 0}
}

type BuilderConfig_Orchestrator_ChildSpec_CollectHandling int32

const (
	BuilderConfig_Orchestrator_ChildSpec_COLLECT_HANDLING_UNSPECIFIED BuilderConfig_Orchestrator_ChildSpec_CollectHandling = 0
	// Indicates the result should be collected PRIOR to updating the
	// 'build' manifest ref, and planning / running HW tests.
	// This also indicates that should the orchestrator terminate before
	// this child finishes the child will be terminated.
	BuilderConfig_Orchestrator_ChildSpec_COLLECT BuilderConfig_Orchestrator_ChildSpec_CollectHandling = 1
	// Indicates the result should not be collected. Currently also
	// indicates that should the orchestrator terminate before this child
	// finishes this child is allowed to continue.
	BuilderConfig_Orchestrator_ChildSpec_NO_COLLECT BuilderConfig_Orchestrator_ChildSpec_CollectHandling = 2
	// Indicates the result should be collected AFTER HW tests are complete.
	// The result is not relevant to the 'build' manifest ref being
	// published.
	// Otherwise no different than COLLECT above.
	BuilderConfig_Orchestrator_ChildSpec_COLLECT_AFTER_HW_TEST BuilderConfig_Orchestrator_ChildSpec_CollectHandling = 3
)

var BuilderConfig_Orchestrator_ChildSpec_CollectHandling_name = map[int32]string{
	0: "COLLECT_HANDLING_UNSPECIFIED",
	1: "COLLECT",
	2: "NO_COLLECT",
	3: "COLLECT_AFTER_HW_TEST",
}

var BuilderConfig_Orchestrator_ChildSpec_CollectHandling_value = map[string]int32{
	"COLLECT_HANDLING_UNSPECIFIED": 0,
	"COLLECT":                      1,
	"NO_COLLECT":                   2,
	"COLLECT_AFTER_HW_TEST":        3,
}

func (x BuilderConfig_Orchestrator_ChildSpec_CollectHandling) String() string {
	return proto.EnumName(BuilderConfig_Orchestrator_ChildSpec_CollectHandling_name, int32(x))
}

func (BuilderConfig_Orchestrator_ChildSpec_CollectHandling) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_6fe67302c16003fb, []int{0, 2, 0, 0}
}

// How to handle the uploading of prebuilts.
type BuilderConfig_Artifacts_Prebuilts int32

const (
	BuilderConfig_Artifacts_PREBUILTS_UNSPECIFIED BuilderConfig_Artifacts_Prebuilts = 0
	BuilderConfig_Artifacts_PUBLIC                BuilderConfig_Artifacts_Prebuilts = 1
	BuilderConfig_Artifacts_PRIVATE               BuilderConfig_Artifacts_Prebuilts = 2
	BuilderConfig_Artifacts_NONE                  BuilderConfig_Artifacts_Prebuilts = 3
)

var BuilderConfig_Artifacts_Prebuilts_name = map[int32]string{
	0: "PREBUILTS_UNSPECIFIED",
	1: "PUBLIC",
	2: "PRIVATE",
	3: "NONE",
}

var BuilderConfig_Artifacts_Prebuilts_value = map[string]int32{
	"PREBUILTS_UNSPECIFIED": 0,
	"PUBLIC":                1,
	"PRIVATE":               2,
	"NONE":                  3,
}

func (x BuilderConfig_Artifacts_Prebuilts) String() string {
	return proto.EnumName(BuilderConfig_Artifacts_Prebuilts_name, int32(x))
}

func (BuilderConfig_Artifacts_Prebuilts) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_6fe67302c16003fb, []int{0, 3, 0}
}

// Used to indicate artifact types that should be uploaded by the builder.
// Must be kept in sync with the dictionary in:
// https://chromium.googlesource.com/chromiumos/infra/recipes/+/refs/heads/master/recipe_modules/cros_artifacts/api.py
// TODO(crbug/1034529): Being replaced by common.ArtifactsByService, to
// eliminate the need to update cros_artifacts every time an artifact type
// is added.
type BuilderConfig_Artifacts_ArtifactTypes int32

const (
	BuilderConfig_Artifacts_ARTIFACT_TYPES_UNSPECIFIED BuilderConfig_Artifacts_ArtifactTypes = 0
	// Indicates wanting a zip file of everything in the image directory.
	BuilderConfig_Artifacts_IMAGE_ZIP BuilderConfig_Artifacts_ArtifactTypes = 1
	// Indicates wanting update payloads.
	BuilderConfig_Artifacts_TEST_UPDATE_PAYLOAD BuilderConfig_Artifacts_ArtifactTypes = 2
	// Indicates wanting the autotest tarballs.
	BuilderConfig_Artifacts_AUTOTEST_FILES BuilderConfig_Artifacts_ArtifactTypes = 3
	// Indicates wanting a tarball containing private TAST test bundles.
	BuilderConfig_Artifacts_TAST_FILES BuilderConfig_Artifacts_ArtifactTypes = 4
	// Indicates wanting a tarball containing guest images and test bundles.
	BuilderConfig_Artifacts_PINNED_GUEST_IMAGES BuilderConfig_Artifacts_ArtifactTypes = 5
	// Indicates wanting an archive of firmware images built from source.
	BuilderConfig_Artifacts_FIRMWARE BuilderConfig_Artifacts_ArtifactTypes = 6
	// Indicates wanting a tarball of the Ebuilds logs.
	BuilderConfig_Artifacts_EBUILD_LOGS BuilderConfig_Artifacts_ArtifactTypes = 7
	// Indicates wanting an archive of the ChromeOS Config.
	BuilderConfig_Artifacts_CHROMEOS_CONFIG BuilderConfig_Artifacts_ArtifactTypes = 8
	// Indicates wanting the CPE report.
	BuilderConfig_Artifacts_CPE_REPORT BuilderConfig_Artifacts_ArtifactTypes = 9
	// Indicates wanting a tar.xz archive for each image that has been
	// created.
	BuilderConfig_Artifacts_IMAGE_ARCHIVES BuilderConfig_Artifacts_ArtifactTypes = 10
	// Artifacts used by the toolchain.
	//
	// Indicates an unvetted orderfile for Chrome.
	BuilderConfig_Artifacts_UNVERIFIED_CHROME_LLVM_ORDERFILE BuilderConfig_Artifacts_ArtifactTypes = 11
	// Indicates a vetted orderfile for Chrome.
	BuilderConfig_Artifacts_VERIFIED_CHROME_LLVM_ORDERFILE BuilderConfig_Artifacts_ArtifactTypes = 12
	// Indicates a clang-tidy artifact.
	BuilderConfig_Artifacts_CHROME_CLANG_WARNINGS_FILE BuilderConfig_Artifacts_ArtifactTypes = 13
	// Indicates a PGO artifact for the compiler.
	BuilderConfig_Artifacts_UNVERIFIED_LLVM_PGO_FILE BuilderConfig_Artifacts_ArtifactTypes = 14
	// Indicates an unvetted AFDO Chrome profile.  (Generated by HW Tests in
	// the benchmark-afdo-generate builder.)
	BuilderConfig_Artifacts_UNVERIFIED_CHROME_BENCHMARK_AFDO_FILE BuilderConfig_Artifacts_ArtifactTypes = 15
	// Indicates a vetted AFDO Chrome profile.
	BuilderConfig_Artifacts_VERIFIED_CHROME_BENCHMARK_AFDO_FILE BuilderConfig_Artifacts_ArtifactTypes = 16
	// Indicates a vetted AFDO Kernel profile.
	BuilderConfig_Artifacts_VERIFIED_KERNEL_CWP_AFDO_FILE BuilderConfig_Artifacts_ArtifactTypes = 17
	// Indicates an unvetted AFDO Kernel CWP profile.
	BuilderConfig_Artifacts_UNVERIFIED_KERNEL_CWP_AFDO_FILE BuilderConfig_Artifacts_ArtifactTypes = 18
	// Indicates an unvetted AFDO Chrome CWP profile.
	BuilderConfig_Artifacts_UNVERIFIED_CHROME_CWP_AFDO_FILE BuilderConfig_Artifacts_ArtifactTypes = 19
	// Indicates a vetted AFDO Chrome CWP profile.
	BuilderConfig_Artifacts_VERIFIED_CHROME_CWP_AFDO_FILE BuilderConfig_Artifacts_ArtifactTypes = 20
	// Indicates a vetted AFDO profile for release.
	BuilderConfig_Artifacts_VERIFIED_RELEASE_AFDO_FILE BuilderConfig_Artifacts_ArtifactTypes = 21
	// Indicates an unvetted AFDO perf data file (from HW Test).
	BuilderConfig_Artifacts_UNVERIFIED_CHROME_BENCHMARK_PERF_FILE BuilderConfig_Artifacts_ArtifactTypes = 22
	// Indicates an unstripped Chrome binary.
	BuilderConfig_Artifacts_CHROME_DEBUG_BINARY BuilderConfig_Artifacts_ArtifactTypes = 23
	// Indicates toolchain logs for the compiler warnings for werror monitor
	BuilderConfig_Artifacts_TOOLCHAIN_WARNING_LOGS BuilderConfig_Artifacts_ArtifactTypes = 24
	// Indicates a prod Chrome AFDO profile for Android/Linux.
	BuilderConfig_Artifacts_CHROME_AFDO_PROFILE_FOR_ANDROID_LINUX BuilderConfig_Artifacts_ArtifactTypes = 25
	// Indicates diagnoses for Clang crashes
	BuilderConfig_Artifacts_CLANG_CRASH_DIAGNOSES BuilderConfig_Artifacts_ArtifactTypes = 26
	// Indicates wanting a tarball containing fingerprint MCU test binaries.
	BuilderConfig_Artifacts_FPMCU_UNITTESTS BuilderConfig_Artifacts_ArtifactTypes = 27
	// Indicates wanting a test image tarball suitable for importing into GCE.
	BuilderConfig_Artifacts_GCE_TARBALL BuilderConfig_Artifacts_ArtifactTypes = 28
)

var BuilderConfig_Artifacts_ArtifactTypes_name = map[int32]string{
	0:  "ARTIFACT_TYPES_UNSPECIFIED",
	1:  "IMAGE_ZIP",
	2:  "TEST_UPDATE_PAYLOAD",
	3:  "AUTOTEST_FILES",
	4:  "TAST_FILES",
	5:  "PINNED_GUEST_IMAGES",
	6:  "FIRMWARE",
	7:  "EBUILD_LOGS",
	8:  "CHROMEOS_CONFIG",
	9:  "CPE_REPORT",
	10: "IMAGE_ARCHIVES",
	11: "UNVERIFIED_CHROME_LLVM_ORDERFILE",
	12: "VERIFIED_CHROME_LLVM_ORDERFILE",
	13: "CHROME_CLANG_WARNINGS_FILE",
	14: "UNVERIFIED_LLVM_PGO_FILE",
	15: "UNVERIFIED_CHROME_BENCHMARK_AFDO_FILE",
	16: "VERIFIED_CHROME_BENCHMARK_AFDO_FILE",
	17: "VERIFIED_KERNEL_CWP_AFDO_FILE",
	18: "UNVERIFIED_KERNEL_CWP_AFDO_FILE",
	19: "UNVERIFIED_CHROME_CWP_AFDO_FILE",
	20: "VERIFIED_CHROME_CWP_AFDO_FILE",
	21: "VERIFIED_RELEASE_AFDO_FILE",
	22: "UNVERIFIED_CHROME_BENCHMARK_PERF_FILE",
	23: "CHROME_DEBUG_BINARY",
	24: "TOOLCHAIN_WARNING_LOGS",
	25: "CHROME_AFDO_PROFILE_FOR_ANDROID_LINUX",
	26: "CLANG_CRASH_DIAGNOSES",
	27: "FPMCU_UNITTESTS",
	28: "GCE_TARBALL",
}

var BuilderConfig_Artifacts_ArtifactTypes_value = map[string]int32{
	"ARTIFACT_TYPES_UNSPECIFIED":            0,
	"IMAGE_ZIP":                             1,
	"TEST_UPDATE_PAYLOAD":                   2,
	"AUTOTEST_FILES":                        3,
	"TAST_FILES":                            4,
	"PINNED_GUEST_IMAGES":                   5,
	"FIRMWARE":                              6,
	"EBUILD_LOGS":                           7,
	"CHROMEOS_CONFIG":                       8,
	"CPE_REPORT":                            9,
	"IMAGE_ARCHIVES":                        10,
	"UNVERIFIED_CHROME_LLVM_ORDERFILE":      11,
	"VERIFIED_CHROME_LLVM_ORDERFILE":        12,
	"CHROME_CLANG_WARNINGS_FILE":            13,
	"UNVERIFIED_LLVM_PGO_FILE":              14,
	"UNVERIFIED_CHROME_BENCHMARK_AFDO_FILE": 15,
	"VERIFIED_CHROME_BENCHMARK_AFDO_FILE":   16,
	"VERIFIED_KERNEL_CWP_AFDO_FILE":         17,
	"UNVERIFIED_KERNEL_CWP_AFDO_FILE":       18,
	"UNVERIFIED_CHROME_CWP_AFDO_FILE":       19,
	"VERIFIED_CHROME_CWP_AFDO_FILE":         20,
	"VERIFIED_RELEASE_AFDO_FILE":            21,
	"UNVERIFIED_CHROME_BENCHMARK_PERF_FILE": 22,
	"CHROME_DEBUG_BINARY":                   23,
	"TOOLCHAIN_WARNING_LOGS":                24,
	"CHROME_AFDO_PROFILE_FOR_ANDROID_LINUX": 25,
	"CLANG_CRASH_DIAGNOSES":                 26,
	"FPMCU_UNITTESTS":                       27,
	"GCE_TARBALL":                           28,
}

func (x BuilderConfig_Artifacts_ArtifactTypes) String() string {
	return proto.EnumName(BuilderConfig_Artifacts_ArtifactTypes_name, int32(x))
}

func (BuilderConfig_Artifacts_ArtifactTypes) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_6fe67302c16003fb, []int{0, 3, 1}
}

// Configuration used by a builder during execution.
type BuilderConfig struct {
	Id                   *BuilderConfig_Id           `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
	General              *BuilderConfig_General      `protobuf:"bytes,2,opt,name=general,proto3" json:"general,omitempty"`
	Orchestrator         *BuilderConfig_Orchestrator `protobuf:"bytes,3,opt,name=orchestrator,proto3" json:"orchestrator,omitempty"`
	Artifacts            *BuilderConfig_Artifacts    `protobuf:"bytes,4,opt,name=artifacts,proto3" json:"artifacts,omitempty"`
	Chrome               *BuilderConfig_Chrome       `protobuf:"bytes,5,opt,name=chrome,proto3" json:"chrome,omitempty"`
	Build                *BuilderConfig_Build        `protobuf:"bytes,6,opt,name=build,proto3" json:"build,omitempty"`
	UnitTests            *BuilderConfig_UnitTests    `protobuf:"bytes,7,opt,name=unit_tests,json=unitTests,proto3" json:"unit_tests,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                    `json:"-"`
	XXX_unrecognized     []byte                      `json:"-"`
	XXX_sizecache        int32                       `json:"-"`
}

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

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

var xxx_messageInfo_BuilderConfig proto.InternalMessageInfo

func (m *BuilderConfig) GetId() *BuilderConfig_Id {
	if m != nil {
		return m.Id
	}
	return nil
}

func (m *BuilderConfig) GetGeneral() *BuilderConfig_General {
	if m != nil {
		return m.General
	}
	return nil
}

func (m *BuilderConfig) GetOrchestrator() *BuilderConfig_Orchestrator {
	if m != nil {
		return m.Orchestrator
	}
	return nil
}

func (m *BuilderConfig) GetArtifacts() *BuilderConfig_Artifacts {
	if m != nil {
		return m.Artifacts
	}
	return nil
}

func (m *BuilderConfig) GetChrome() *BuilderConfig_Chrome {
	if m != nil {
		return m.Chrome
	}
	return nil
}

func (m *BuilderConfig) GetBuild() *BuilderConfig_Build {
	if m != nil {
		return m.Build
	}
	return nil
}

func (m *BuilderConfig) GetUnitTests() *BuilderConfig_UnitTests {
	if m != nil {
		return m.UnitTests
	}
	return nil
}

// Unique identifier of the builder configuration.
type BuilderConfig_Id struct {
	// The name of the configuration such as "arm-generic-postsubmit".
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Branch the configuration applies to such as "release-R73-11647.B".
	Branch               string                `protobuf:"bytes,2,opt,name=branch,proto3" json:"branch,omitempty"`
	Type                 BuilderConfig_Id_Type `protobuf:"varint,3,opt,name=type,proto3,enum=chromiumos.BuilderConfig_Id_Type" json:"type,omitempty"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

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

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

var xxx_messageInfo_BuilderConfig_Id proto.InternalMessageInfo

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

func (m *BuilderConfig_Id) GetBranch() string {
	if m != nil {
		return m.Branch
	}
	return ""
}

func (m *BuilderConfig_Id) GetType() BuilderConfig_Id_Type {
	if m != nil {
		return m.Type
	}
	return BuilderConfig_Id_TYPE_UNSPECIFIED
}

// General configuration for the builder.
type BuilderConfig_General struct {
	// Whether or not the build is considered critical. A failure in a critical
	// build for a CQ builder may, for example, prevent submission of the CL.
	Critical    *wrappers.BoolValue               `protobuf:"bytes,1,opt,name=critical,proto3" json:"critical,omitempty"`
	Environment BuilderConfig_General_Environment `protobuf:"varint,2,opt,name=environment,proto3,enum=chromiumos.BuilderConfig_General_Environment" json:"environment,omitempty"`
	// A rule describing conditions under which this builder should be launched.
	RunWhen *BuilderConfig_General_RunWhen `protobuf:"bytes,3,opt,name=run_when,json=runWhen,proto3" json:"run_when,omitempty"`
	// Time before which ToT had a bug that would not manifest at the
	// build stage. The CQ orchestrator should NOT reuse successful builds
	// of the build_config before this.
	BrokenBefore *timestamp.Timestamp `protobuf:"bytes,4,opt,name=broken_before,json=brokenBefore,proto3" json:"broken_before,omitempty"`
	// If present, this version number will be written to a version file
	// alongside a bot's SDK Cache (chroot). On subsequent bot-run where an SDK
	// Cache already exists, the version number in config will be compared to
	// the number present in the version file, and the SDK Cache will be
	// invalidated if there is a mismatch.
	SdkCacheVersion int32 `protobuf:"varint,5,opt,name=sdk_cache_version,json=sdkCacheVersion,proto3" json:"sdk_cache_version,omitempty"`
	// Indicates whether the target is a unibuild.
	Unibuild             bool                           `protobuf:"varint,6,opt,name=unibuild,proto3" json:"unibuild,omitempty"`
	Manifest             BuilderConfig_General_Manifest `protobuf:"varint,7,opt,name=manifest,proto3,enum=chromiumos.BuilderConfig_General_Manifest" json:"manifest,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                       `json:"-"`
	XXX_unrecognized     []byte                         `json:"-"`
	XXX_sizecache        int32                          `json:"-"`
}

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

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

var xxx_messageInfo_BuilderConfig_General proto.InternalMessageInfo

func (m *BuilderConfig_General) GetCritical() *wrappers.BoolValue {
	if m != nil {
		return m.Critical
	}
	return nil
}

func (m *BuilderConfig_General) GetEnvironment() BuilderConfig_General_Environment {
	if m != nil {
		return m.Environment
	}
	return BuilderConfig_General_ENVIRONMENT_UNSPECIFIED
}

func (m *BuilderConfig_General) GetRunWhen() *BuilderConfig_General_RunWhen {
	if m != nil {
		return m.RunWhen
	}
	return nil
}

func (m *BuilderConfig_General) GetBrokenBefore() *timestamp.Timestamp {
	if m != nil {
		return m.BrokenBefore
	}
	return nil
}

func (m *BuilderConfig_General) GetSdkCacheVersion() int32 {
	if m != nil {
		return m.SdkCacheVersion
	}
	return 0
}

func (m *BuilderConfig_General) GetUnibuild() bool {
	if m != nil {
		return m.Unibuild
	}
	return false
}

func (m *BuilderConfig_General) GetManifest() BuilderConfig_General_Manifest {
	if m != nil {
		return m.Manifest
	}
	return BuilderConfig_General_MANIFEST_UNSPECIFIED
}

// Rule describing conditions under which a builder should be launched.
type BuilderConfig_General_RunWhen struct {
	Mode BuilderConfig_General_RunWhen_Mode `protobuf:"varint,1,opt,name=mode,proto3,enum=chromiumos.BuilderConfig_General_RunWhen_Mode" json:"mode,omitempty"`
	// chromiumos code file patterns, relative to chromiumos root, which may
	// use * or ** for globbing.
	// e.g.
	// chromite/myfile.txt
	// chromite/config/*
	// **/*.md
	FilePatterns         []string `protobuf:"bytes,2,rep,name=file_patterns,json=filePatterns,proto3" json:"file_patterns,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_BuilderConfig_General_RunWhen proto.InternalMessageInfo

func (m *BuilderConfig_General_RunWhen) GetMode() BuilderConfig_General_RunWhen_Mode {
	if m != nil {
		return m.Mode
	}
	return BuilderConfig_General_RunWhen_MODE_UNSPECIFIED
}

func (m *BuilderConfig_General_RunWhen) GetFilePatterns() []string {
	if m != nil {
		return m.FilePatterns
	}
	return nil
}

// Configuration pertaining to builders operating as "orchestrators".
// Orchestrators orchestrate the running of other child builders.
type BuilderConfig_Orchestrator struct {
	ChildSpecs []*BuilderConfig_Orchestrator_ChildSpec `protobuf:"bytes,5,rep,name=child_specs,json=childSpecs,proto3" json:"child_specs,omitempty"`
	// GitilesCommit to use if not provided.
	GitilesCommit *GitilesCommit `protobuf:"bytes,2,opt,name=gitiles_commit,json=gitilesCommit,proto3" json:"gitiles_commit,omitempty"`
	// GerritChanges to apply.  To ignore these changes, use
	// $chromeos/cros_infra_config.ignore_config_changelist=True.
	GerritChanges        []*GerritChange                                  `protobuf:"bytes,3,rep,name=gerrit_changes,json=gerritChanges,proto3" json:"gerrit_changes,omitempty"`
	FollowOnOrchestrator *BuilderConfig_Orchestrator_FollowOnOrchestrator `protobuf:"bytes,4,opt,name=follow_on_orchestrator,json=followOnOrchestrator,proto3" json:"follow_on_orchestrator,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                         `json:"-"`
	XXX_unrecognized     []byte                                           `json:"-"`
	XXX_sizecache        int32                                            `json:"-"`
}

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

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

var xxx_messageInfo_BuilderConfig_Orchestrator proto.InternalMessageInfo

func (m *BuilderConfig_Orchestrator) GetChildSpecs() []*BuilderConfig_Orchestrator_ChildSpec {
	if m != nil {
		return m.ChildSpecs
	}
	return nil
}

func (m *BuilderConfig_Orchestrator) GetGitilesCommit() *GitilesCommit {
	if m != nil {
		return m.GitilesCommit
	}
	return nil
}

func (m *BuilderConfig_Orchestrator) GetGerritChanges() []*GerritChange {
	if m != nil {
		return m.GerritChanges
	}
	return nil
}

func (m *BuilderConfig_Orchestrator) GetFollowOnOrchestrator() *BuilderConfig_Orchestrator_FollowOnOrchestrator {
	if m != nil {
		return m.FollowOnOrchestrator
	}
	return nil
}

// Defines a child the orchestrator spawns and how it is handled.
type BuilderConfig_Orchestrator_ChildSpec struct {
	// BuilderConfig.Id.name of the child build. Would be expected to match
	// this name and the BuilderConfig.Id.branch and BuilderConfig.Id.type of
	// this parent orchestrator builder.
	Name                 string                                               `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	CollectHandling      BuilderConfig_Orchestrator_ChildSpec_CollectHandling `protobuf:"varint,2,opt,name=collect_handling,json=collectHandling,proto3,enum=chromiumos.BuilderConfig_Orchestrator_ChildSpec_CollectHandling" json:"collect_handling,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                             `json:"-"`
	XXX_unrecognized     []byte                                               `json:"-"`
	XXX_sizecache        int32                                                `json:"-"`
}

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

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

var xxx_messageInfo_BuilderConfig_Orchestrator_ChildSpec proto.InternalMessageInfo

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

func (m *BuilderConfig_Orchestrator_ChildSpec) GetCollectHandling() BuilderConfig_Orchestrator_ChildSpec_CollectHandling {
	if m != nil {
		return m.CollectHandling
	}
	return BuilderConfig_Orchestrator_ChildSpec_COLLECT_HANDLING_UNSPECIFIED
}

// Follow on orchestrator to launch, and possibly wait for.
type BuilderConfig_Orchestrator_FollowOnOrchestrator struct {
	// BuilderConfig.Id.name of the follow on orchestrator.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Whether to wait for the follow on orchestrator to finish.
	AwaitCompletion      bool     `protobuf:"varint,2,opt,name=await_completion,json=awaitCompletion,proto3" json:"await_completion,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_BuilderConfig_Orchestrator_FollowOnOrchestrator proto.InternalMessageInfo

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

func (m *BuilderConfig_Orchestrator_FollowOnOrchestrator) GetAwaitCompletion() bool {
	if m != nil {
		return m.AwaitCompletion
	}
	return false
}

// Configuration pertaining to artifacts produced during a build.
type BuilderConfig_Artifacts struct {
	Prebuilts     BuilderConfig_Artifacts_Prebuilts       `protobuf:"varint,1,opt,name=prebuilts,proto3,enum=chromiumos.BuilderConfig_Artifacts_Prebuilts" json:"prebuilts,omitempty"`
	ArtifactTypes []BuilderConfig_Artifacts_ArtifactTypes `protobuf:"varint,2,rep,packed,name=artifact_types,json=artifactTypes,proto3,enum=chromiumos.BuilderConfig_Artifacts_ArtifactTypes" json:"artifact_types,omitempty"`
	// Google storage bucket to upload prebuilts to.
	PrebuiltsGsBucket string `protobuf:"bytes,3,opt,name=prebuilts_gs_bucket,json=prebuiltsGsBucket,proto3" json:"prebuilts_gs_bucket,omitempty"`
	// Google storage bucket to upload all artifacts to.
	ArtifactsGsBucket string `protobuf:"bytes,4,opt,name=artifacts_gs_bucket,json=artifactsGsBucket,proto3" json:"artifacts_gs_bucket,omitempty"`
	// There may be more than one set of publishing instructions.
	PublishArtifacts []*BuilderConfig_Artifacts_PublishInfo `protobuf:"bytes,5,rep,name=publish_artifacts,json=publishArtifacts,proto3" json:"publish_artifacts,omitempty"`
	// There may be more than one set of consumable artifacts.
	InputArtifacts []*BuilderConfig_Artifacts_InputArtifactInfo `protobuf:"bytes,6,rep,name=input_artifacts,json=inputArtifacts,proto3" json:"input_artifacts,omitempty"`
	// Profile information needed by artifact prepare/bundle endpoints.
	// TODO(crbug/1034529): DEPRECATED: see artifacts_info.
	ArtifactProfileInfo *ArtifactProfileInfo `protobuf:"bytes,7,opt,name=artifact_profile_info,json=artifactProfileInfo,proto3" json:"artifact_profile_info,omitempty"`
	// Artifacts separated by service.
	ArtifactsInfo        *ArtifactsByService `protobuf:"bytes,8,opt,name=artifacts_info,json=artifactsInfo,proto3" json:"artifacts_info,omitempty"`
	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
	XXX_unrecognized     []byte              `json:"-"`
	XXX_sizecache        int32               `json:"-"`
}

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

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

var xxx_messageInfo_BuilderConfig_Artifacts proto.InternalMessageInfo

func (m *BuilderConfig_Artifacts) GetPrebuilts() BuilderConfig_Artifacts_Prebuilts {
	if m != nil {
		return m.Prebuilts
	}
	return BuilderConfig_Artifacts_PREBUILTS_UNSPECIFIED
}

func (m *BuilderConfig_Artifacts) GetArtifactTypes() []BuilderConfig_Artifacts_ArtifactTypes {
	if m != nil {
		return m.ArtifactTypes
	}
	return nil
}

func (m *BuilderConfig_Artifacts) GetPrebuiltsGsBucket() string {
	if m != nil {
		return m.PrebuiltsGsBucket
	}
	return ""
}

func (m *BuilderConfig_Artifacts) GetArtifactsGsBucket() string {
	if m != nil {
		return m.ArtifactsGsBucket
	}
	return ""
}

func (m *BuilderConfig_Artifacts) GetPublishArtifacts() []*BuilderConfig_Artifacts_PublishInfo {
	if m != nil {
		return m.PublishArtifacts
	}
	return nil
}

func (m *BuilderConfig_Artifacts) GetInputArtifacts() []*BuilderConfig_Artifacts_InputArtifactInfo {
	if m != nil {
		return m.InputArtifacts
	}
	return nil
}

func (m *BuilderConfig_Artifacts) GetArtifactProfileInfo() *ArtifactProfileInfo {
	if m != nil {
		return m.ArtifactProfileInfo
	}
	return nil
}

func (m *BuilderConfig_Artifacts) GetArtifactsInfo() *ArtifactsByService {
	if m != nil {
		return m.ArtifactsInfo
	}
	return nil
}

// TODO(crbug/1034529): DEPRECATED: see artifacts_info.
type BuilderConfig_Artifacts_PublishInfo struct {
	// Artifact types to publish to this bucket.
	PublishTypes []BuilderConfig_Artifacts_ArtifactTypes `protobuf:"varint,2,rep,packed,name=publish_types,json=publishTypes,proto3,enum=chromiumos.BuilderConfig_Artifacts_ArtifactTypes" json:"publish_types,omitempty"`
	// GS location in which to publish artifacts ("gs://" is prepended).
	// Several fields can be logically specified:
	//   %(kind)s: BuilderConfig.Id.Type with underscores turned into hyphens.
	//   %(version)s: Chromeos version (e.g., R81-12813.0.0)
	//   %(build_id)s: Buildbucket job ID.
	//   %(target)s: build target name.
	//   %(builder_name)s: The builder name (e.g. octopus-cq), lowercase with
	//       underscores turned into hyphens.
	//   %(gs_path)s: "%(builder_name)s/%(version)s-%(build_id)s".
	//   %(artifact_name)s: The name of the artifact being published.
	PublishGsLocation string `protobuf:"bytes,3,opt,name=publish_gs_location,json=publishGsLocation,proto3" json:"publish_gs_location,omitempty"`
	// Any acl to apply, such as "public-read".
	AclName              string   `protobuf:"bytes,4,opt,name=acl_name,json=aclName,proto3" json:"acl_name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_BuilderConfig_Artifacts_PublishInfo proto.InternalMessageInfo

func (m *BuilderConfig_Artifacts_PublishInfo) GetPublishTypes() []BuilderConfig_Artifacts_ArtifactTypes {
	if m != nil {
		return m.PublishTypes
	}
	return nil
}

func (m *BuilderConfig_Artifacts_PublishInfo) GetPublishGsLocation() string {
	if m != nil {
		return m.PublishGsLocation
	}
	return ""
}

func (m *BuilderConfig_Artifacts_PublishInfo) GetAclName() string {
	if m != nil {
		return m.AclName
	}
	return ""
}

// TODO(crbug/1034529): DEPRECATED: see artifacts_info.
type BuilderConfig_Artifacts_InputArtifactInfo struct {
	// Artifact type to seek in these buckets.  Use the first instance of the
	// artifact found in the list of locations.
	InputArtifactType BuilderConfig_Artifacts_ArtifactTypes `protobuf:"varint,1,opt,name=input_artifact_type,json=inputArtifactType,proto3,enum=chromiumos.BuilderConfig_Artifacts_ArtifactTypes" json:"input_artifact_type,omitempty"`
	// Google storage locations containing these artifacts.
	InputArtifactGsLocations []string `protobuf:"bytes,2,rep,name=input_artifact_gs_locations,json=inputArtifactGsLocations,proto3" json:"input_artifact_gs_locations,omitempty"`
	XXX_NoUnkeyedLiteral     struct{} `json:"-"`
	XXX_unrecognized         []byte   `json:"-"`
	XXX_sizecache            int32    `json:"-"`
}

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

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

var xxx_messageInfo_BuilderConfig_Artifacts_InputArtifactInfo proto.InternalMessageInfo

func (m *BuilderConfig_Artifacts_InputArtifactInfo) GetInputArtifactType() BuilderConfig_Artifacts_ArtifactTypes {
	if m != nil {
		return m.InputArtifactType
	}
	return BuilderConfig_Artifacts_ARTIFACT_TYPES_UNSPECIFIED
}

func (m *BuilderConfig_Artifacts_InputArtifactInfo) GetInputArtifactGsLocations() []string {
	if m != nil {
		return m.InputArtifactGsLocations
	}
	return nil
}

// Configuration pertaining to Chrome.
type BuilderConfig_Chrome struct {
	// Whether to build internal or external Chrome. Internal chrome adds
	// Chrome branding.
	Internal             bool     `protobuf:"varint,1,opt,name=internal,proto3" json:"internal,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_BuilderConfig_Chrome proto.InternalMessageInfo

func (m *BuilderConfig_Chrome) GetInternal() bool {
	if m != nil {
		return m.Internal
	}
	return false
}

// Build specific configuration.
type BuilderConfig_Build struct {
	// USE flags to use with the build.
	UseFlags       []*UseFlag                          `protobuf:"bytes,1,rep,name=use_flags,json=useFlags,proto3" json:"use_flags,omitempty"`
	PortageProfile *BuilderConfig_Build_PortageProfile `protobuf:"bytes,2,opt,name=portage_profile,json=portageProfile,proto3" json:"portage_profile,omitempty"`
	// Whether to apply gerrit changes, if any. Use case is to build without
	// changes after failure to identify the changes as the culprit.
	ApplyGerritChanges   bool                                  `protobuf:"varint,6,opt,name=apply_gerrit_changes,json=applyGerritChanges,proto3" json:"apply_gerrit_changes,omitempty"`
	PrepareForBuild      *BuilderConfig_Build_PrepareForBuild  `protobuf:"bytes,17,opt,name=prepare_for_build,json=prepareForBuild,proto3" json:"prepare_for_build,omitempty"`
	SdkUpdate            *BuilderConfig_Build_SdkUpdate        `protobuf:"bytes,12,opt,name=sdk_update,json=sdkUpdate,proto3" json:"sdk_update,omitempty"`
	InstallToolchain     *BuilderConfig_Build_InstallToolchain `protobuf:"bytes,13,opt,name=install_toolchain,json=installToolchain,proto3" json:"install_toolchain,omitempty"`
	InstallPackages      *BuilderConfig_Build_InstallPackages  `protobuf:"bytes,16,opt,name=install_packages,json=installPackages,proto3" json:"install_packages,omitempty"`
	BuildImages          *BuilderConfig_Build_BuildImages      `protobuf:"bytes,15,opt,name=build_images,json=buildImages,proto3" json:"build_images,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                              `json:"-"`
	XXX_unrecognized     []byte                                `json:"-"`
	XXX_sizecache        int32                                 `json:"-"`
}

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

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

var xxx_messageInfo_BuilderConfig_Build proto.InternalMessageInfo

func (m *BuilderConfig_Build) GetUseFlags() []*UseFlag {
	if m != nil {
		return m.UseFlags
	}
	return nil
}

func (m *BuilderConfig_Build) GetPortageProfile() *BuilderConfig_Build_PortageProfile {
	if m != nil {
		return m.PortageProfile
	}
	return nil
}

func (m *BuilderConfig_Build) GetApplyGerritChanges() bool {
	if m != nil {
		return m.ApplyGerritChanges
	}
	return false
}

func (m *BuilderConfig_Build) GetPrepareForBuild() *BuilderConfig_Build_PrepareForBuild {
	if m != nil {
		return m.PrepareForBuild
	}
	return nil
}

func (m *BuilderConfig_Build) GetSdkUpdate() *BuilderConfig_Build_SdkUpdate {
	if m != nil {
		return m.SdkUpdate
	}
	return nil
}

func (m *BuilderConfig_Build) GetInstallToolchain() *BuilderConfig_Build_InstallToolchain {
	if m != nil {
		return m.InstallToolchain
	}
	return nil
}

func (m *BuilderConfig_Build) GetInstallPackages() *BuilderConfig_Build_InstallPackages {
	if m != nil {
		return m.InstallPackages
	}
	return nil
}

func (m *BuilderConfig_Build) GetBuildImages() *BuilderConfig_Build_BuildImages {
	if m != nil {
		return m.BuildImages
	}
	return nil
}

// The profile of the variant to set up and build.
type BuilderConfig_Build_PortageProfile struct {
	Profile              string   `protobuf:"bytes,1,opt,name=profile,proto3" json:"profile,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_BuilderConfig_Build_PortageProfile proto.InternalMessageInfo

func (m *BuilderConfig_Build_PortageProfile) GetProfile() string {
	if m != nil {
		return m.Profile
	}
	return ""
}

// Controls for the call to cros_artifacts.prepare_for_build.
// TODO(crbug/1019868): Drop this after all users have switched to
// artifacts.artifactProfileInfo.
type BuilderConfig_Build_PrepareForBuild struct {
	// Additional arguments from common.proto, passed into any
	// PrepareFor*Build endpoint.
	AdditionalArgs       *PrepareForBuildAdditionalArgs `protobuf:"bytes,1,opt,name=additional_args,json=additionalArgs,proto3" json:"additional_args,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                       `json:"-"`
	XXX_unrecognized     []byte                         `json:"-"`
	XXX_sizecache        int32                          `json:"-"`
}

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

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

var xxx_messageInfo_BuilderConfig_Build_PrepareForBuild proto.InternalMessageInfo

func (m *BuilderConfig_Build_PrepareForBuild) GetAdditionalArgs() *PrepareForBuildAdditionalArgs {
	if m != nil {
		return m.AdditionalArgs
	}
	return nil
}

// Controls for the call to SdkService.Update.
type BuilderConfig_Build_SdkUpdate struct {
	// Whether to compile from source (vs using prebuilts when able.)
	CompileSource        bool     `protobuf:"varint,1,opt,name=compile_source,json=compileSource,proto3" json:"compile_source,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_BuilderConfig_Build_SdkUpdate proto.InternalMessageInfo

func (m *BuilderConfig_Build_SdkUpdate) GetCompileSource() bool {
	if m != nil {
		return m.CompileSource
	}
	return false
}

// Controls for the call to SysrootService.InstallToolchain.
type BuilderConfig_Build_InstallToolchain struct {
	// Whether to compile from source (vs using prebuilts when able.)
	CompileSource        bool     `protobuf:"varint,1,opt,name=compile_source,json=compileSource,proto3" json:"compile_source,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_BuilderConfig_Build_InstallToolchain proto.InternalMessageInfo

func (m *BuilderConfig_Build_InstallToolchain) GetCompileSource() bool {
	if m != nil {
		return m.CompileSource
	}
	return false
}

// Controls for the call to InstallPackages.
type BuilderConfig_Build_InstallPackages struct {
	// Whether to compile from source (vs using prebuilts when able.)
	CompileSource bool `protobuf:"varint,1,opt,name=compile_source,json=compileSource,proto3" json:"compile_source,omitempty"`
	// Controls the running of the install packages step.
	RunSpec BuilderConfig_RunSpec `protobuf:"varint,2,opt,name=run_spec,json=runSpec,proto3,enum=chromiumos.BuilderConfig_RunSpec" json:"run_spec,omitempty"`
	// Packages to build, or empty to build all packages.
	Packages []*PackageInfo `protobuf:"bytes,3,rep,name=packages,proto3" json:"packages,omitempty"`
	// Certain builders (e.g., clang-tidy-toolchain) need to build Chrome with
	// goma disabled.
	DisableGoma bool `protobuf:"varint,4,opt,name=disable_goma,json=disableGoma,proto3" json:"disable_goma,omitempty"`
	// Set of package dependencies to install.
	Dependencies         BuilderConfig_Dependencies `protobuf:"varint,5,opt,name=dependencies,proto3,enum=chromiumos.BuilderConfig_Dependencies" json:"dependencies,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                   `json:"-"`
	XXX_unrecognized     []byte                     `json:"-"`
	XXX_sizecache        int32                      `json:"-"`
}

func (m *BuilderConfig_Build_InstallPackages) Reset()         { *m = BuilderConfig_Build_InstallPackages{} }
func (m *BuilderConfig_Build_InstallPackages) String() string { return proto.CompactTextString(m) }
func (*BuilderConfig_Build_InstallPackages) ProtoMessage()    {}
func (*BuilderConfig_Build_InstallPackages) Descriptor() ([]byte, []int) {
	return fileDescriptor_6fe67302c16003fb, []int{0, 5, 4}
}

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

var xxx_messageInfo_BuilderConfig_Build_InstallPackages proto.InternalMessageInfo

func (m *BuilderConfig_Build_InstallPackages) GetCompileSource() bool {
	if m != nil {
		return m.CompileSource
	}
	return false
}

func (m *BuilderConfig_Build_InstallPackages) GetRunSpec() BuilderConfig_RunSpec {
	if m != nil {
		return m.RunSpec
	}
	return BuilderConfig_RUN_SPEC_UNSPECIFIED
}

func (m *BuilderConfig_Build_InstallPackages) GetPackages() []*PackageInfo {
	if m != nil {
		return m.Packages
	}
	return nil
}

func (m *BuilderConfig_Build_InstallPackages) GetDisableGoma() bool {
	if m != nil {
		return m.DisableGoma
	}
	return false
}

func (m *BuilderConfig_Build_InstallPackages) GetDependencies() BuilderConfig_Dependencies {
	if m != nil {
		return m.Dependencies
	}
	return BuilderConfig_DEPENDENCIES_UNSPECIFIED
}

type BuilderConfig_Build_BuildImages struct {
	// Image types to build.
	ImageTypes []ImageType `protobuf:"varint,1,rep,packed,name=image_types,json=imageTypes,proto3,enum=chromiumos.ImageType" json:"image_types,omitempty"`
	// Whether to disable rootfs verification.
	DisableRootfsVerification bool `protobuf:"varint,2,opt,name=disable_rootfs_verification,json=disableRootfsVerification,proto3" json:"disable_rootfs_verification,omitempty"`
	// Custom disk layout to use. Note that large images can damage the lab,
	// so don't use such images for hw testing.
	// e.g. 4gb-rootfs
	DiskLayout           string   `protobuf:"bytes,3,opt,name=disk_layout,json=diskLayout,proto3" json:"disk_layout,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_BuilderConfig_Build_BuildImages proto.InternalMessageInfo

func (m *BuilderConfig_Build_BuildImages) GetImageTypes() []ImageType {
	if m != nil {
		return m.ImageTypes
	}
	return nil
}

func (m *BuilderConfig_Build_BuildImages) GetDisableRootfsVerification() bool {
	if m != nil {
		return m.DisableRootfsVerification
	}
	return false
}

func (m *BuilderConfig_Build_BuildImages) GetDiskLayout() string {
	if m != nil {
		return m.DiskLayout
	}
	return ""
}

type BuilderConfig_UnitTests struct {
	// Skipped packages.
	PackageBlacklist []*PackageInfo `protobuf:"bytes,4,rep,name=package_blacklist,json=packageBlacklist,proto3" json:"package_blacklist,omitempty"`
	// Controls the running of ebuild tests with possible early exit.
	EbuildsRunSpec BuilderConfig_RunSpec `protobuf:"varint,5,opt,name=ebuilds_run_spec,json=ebuildsRunSpec,proto3,enum=chromiumos.BuilderConfig_RunSpec" json:"ebuilds_run_spec,omitempty"`
	// Whether to assume the sysroot is empty.
	EmptySysroot bool `protobuf:"varint,6,opt,name=empty_sysroot,json=emptySysroot,proto3" json:"empty_sysroot,omitempty"`
	// Packages to be tested.
	// Defaults to all testable packages when none are given.
	Packages []*PackageInfo `protobuf:"bytes,7,rep,name=packages,proto3" json:"packages,omitempty"`
	// Set of package dependencies to test.
	Dependencies         BuilderConfig_Dependencies `protobuf:"varint,8,opt,name=dependencies,proto3,enum=chromiumos.BuilderConfig_Dependencies" json:"dependencies,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                   `json:"-"`
	XXX_unrecognized     []byte                     `json:"-"`
	XXX_sizecache        int32                      `json:"-"`
}

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

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

var xxx_messageInfo_BuilderConfig_UnitTests proto.InternalMessageInfo

func (m *BuilderConfig_UnitTests) GetPackageBlacklist() []*PackageInfo {
	if m != nil {
		return m.PackageBlacklist
	}
	return nil
}

func (m *BuilderConfig_UnitTests) GetEbuildsRunSpec() BuilderConfig_RunSpec {
	if m != nil {
		return m.EbuildsRunSpec
	}
	return BuilderConfig_RUN_SPEC_UNSPECIFIED
}

func (m *BuilderConfig_UnitTests) GetEmptySysroot() bool {
	if m != nil {
		return m.EmptySysroot
	}
	return false
}

func (m *BuilderConfig_UnitTests) GetPackages() []*PackageInfo {
	if m != nil {
		return m.Packages
	}
	return nil
}

func (m *BuilderConfig_UnitTests) GetDependencies() BuilderConfig_Dependencies {
	if m != nil {
		return m.Dependencies
	}
	return BuilderConfig_DEPENDENCIES_UNSPECIFIED
}

// List of builder configs. Intended to be serialized to / from disk.
type BuilderConfigs struct {
	BuilderConfigs       []*BuilderConfig `protobuf:"bytes,1,rep,name=builder_configs,json=builderConfigs,proto3" json:"builder_configs,omitempty"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

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

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

var xxx_messageInfo_BuilderConfigs proto.InternalMessageInfo

func (m *BuilderConfigs) GetBuilderConfigs() []*BuilderConfig {
	if m != nil {
		return m.BuilderConfigs
	}
	return nil
}

func init() {
	proto.RegisterEnum("chromiumos.BuilderConfig_RunSpec", BuilderConfig_RunSpec_name, BuilderConfig_RunSpec_value)
	proto.RegisterEnum("chromiumos.BuilderConfig_Dependencies", BuilderConfig_Dependencies_name, BuilderConfig_Dependencies_value)
	proto.RegisterEnum("chromiumos.BuilderConfig_Id_Type", BuilderConfig_Id_Type_name, BuilderConfig_Id_Type_value)
	proto.RegisterEnum("chromiumos.BuilderConfig_General_Environment", BuilderConfig_General_Environment_name, BuilderConfig_General_Environment_value)
	proto.RegisterEnum("chromiumos.BuilderConfig_General_Manifest", BuilderConfig_General_Manifest_name, BuilderConfig_General_Manifest_value)
	proto.RegisterEnum("chromiumos.BuilderConfig_General_RunWhen_Mode", BuilderConfig_General_RunWhen_Mode_name, BuilderConfig_General_RunWhen_Mode_value)
	proto.RegisterEnum("chromiumos.BuilderConfig_Orchestrator_ChildSpec_CollectHandling", BuilderConfig_Orchestrator_ChildSpec_CollectHandling_name, BuilderConfig_Orchestrator_ChildSpec_CollectHandling_value)
	proto.RegisterEnum("chromiumos.BuilderConfig_Artifacts_Prebuilts", BuilderConfig_Artifacts_Prebuilts_name, BuilderConfig_Artifacts_Prebuilts_value)
	proto.RegisterEnum("chromiumos.BuilderConfig_Artifacts_ArtifactTypes", BuilderConfig_Artifacts_ArtifactTypes_name, BuilderConfig_Artifacts_ArtifactTypes_value)
	proto.RegisterType((*BuilderConfig)(nil), "chromiumos.BuilderConfig")
	proto.RegisterType((*BuilderConfig_Id)(nil), "chromiumos.BuilderConfig.Id")
	proto.RegisterType((*BuilderConfig_General)(nil), "chromiumos.BuilderConfig.General")
	proto.RegisterType((*BuilderConfig_General_RunWhen)(nil), "chromiumos.BuilderConfig.General.RunWhen")
	proto.RegisterType((*BuilderConfig_Orchestrator)(nil), "chromiumos.BuilderConfig.Orchestrator")
	proto.RegisterType((*BuilderConfig_Orchestrator_ChildSpec)(nil), "chromiumos.BuilderConfig.Orchestrator.ChildSpec")
	proto.RegisterType((*BuilderConfig_Orchestrator_FollowOnOrchestrator)(nil), "chromiumos.BuilderConfig.Orchestrator.FollowOnOrchestrator")
	proto.RegisterType((*BuilderConfig_Artifacts)(nil), "chromiumos.BuilderConfig.Artifacts")
	proto.RegisterType((*BuilderConfig_Artifacts_PublishInfo)(nil), "chromiumos.BuilderConfig.Artifacts.PublishInfo")
	proto.RegisterType((*BuilderConfig_Artifacts_InputArtifactInfo)(nil), "chromiumos.BuilderConfig.Artifacts.InputArtifactInfo")
	proto.RegisterType((*BuilderConfig_Chrome)(nil), "chromiumos.BuilderConfig.Chrome")
	proto.RegisterType((*BuilderConfig_Build)(nil), "chromiumos.BuilderConfig.Build")
	proto.RegisterType((*BuilderConfig_Build_PortageProfile)(nil), "chromiumos.BuilderConfig.Build.PortageProfile")
	proto.RegisterType((*BuilderConfig_Build_PrepareForBuild)(nil), "chromiumos.BuilderConfig.Build.PrepareForBuild")
	proto.RegisterType((*BuilderConfig_Build_SdkUpdate)(nil), "chromiumos.BuilderConfig.Build.SdkUpdate")
	proto.RegisterType((*BuilderConfig_Build_InstallToolchain)(nil), "chromiumos.BuilderConfig.Build.InstallToolchain")
	proto.RegisterType((*BuilderConfig_Build_InstallPackages)(nil), "chromiumos.BuilderConfig.Build.InstallPackages")
	proto.RegisterType((*BuilderConfig_Build_BuildImages)(nil), "chromiumos.BuilderConfig.Build.BuildImages")
	proto.RegisterType((*BuilderConfig_UnitTests)(nil), "chromiumos.BuilderConfig.UnitTests")
	proto.RegisterType((*BuilderConfigs)(nil), "chromiumos.BuilderConfigs")
}

func init() { proto.RegisterFile("chromiumos/builder_config.proto", fileDescriptor_6fe67302c16003fb) }

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