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

package chromiumos

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	math "math"
)

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package

// The types of images that can be built.
// These correspond to support types in lib/constants.py such
// as IMAGE_TYPE_BASE, IMAGE_TYPE_RECOVERY, and so on.
type ImageType int32

const (
	ImageType_IMAGE_TYPE_UNDEFINED ImageType = 0
	ImageType_BASE                 ImageType = 1
	ImageType_DEV                  ImageType = 2
	ImageType_TEST                 ImageType = 3
	ImageType_BASE_VM              ImageType = 4
	ImageType_TEST_VM              ImageType = 5
	ImageType_RECOVERY             ImageType = 6
	ImageType_FACTORY              ImageType = 7
	ImageType_FIRMWARE             ImageType = 8
	ImageType_CR50_FIRMWARE        ImageType = 9
	ImageType_BASE_GUEST_VM        ImageType = 10
	ImageType_TEST_GUEST_VM        ImageType = 11
	ImageType_DLC                  ImageType = 12
)

var ImageType_name = map[int32]string{
	0:  "IMAGE_TYPE_UNDEFINED",
	1:  "BASE",
	2:  "DEV",
	3:  "TEST",
	4:  "BASE_VM",
	5:  "TEST_VM",
	6:  "RECOVERY",
	7:  "FACTORY",
	8:  "FIRMWARE",
	9:  "CR50_FIRMWARE",
	10: "BASE_GUEST_VM",
	11: "TEST_GUEST_VM",
	12: "DLC",
}

var ImageType_value = map[string]int32{
	"IMAGE_TYPE_UNDEFINED": 0,
	"BASE":                 1,
	"DEV":                  2,
	"TEST":                 3,
	"BASE_VM":              4,
	"TEST_VM":              5,
	"RECOVERY":             6,
	"FACTORY":              7,
	"FIRMWARE":             8,
	"CR50_FIRMWARE":        9,
	"BASE_GUEST_VM":        10,
	"TEST_GUEST_VM":        11,
	"DLC":                  12,
}

func (x ImageType) String() string {
	return proto.EnumName(ImageType_name, int32(x))
}

func (ImageType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{0}
}

// The various channels that we release through.
type Channel int32

const (
	Channel_CHANNEL_UNSPECIFIED Channel = 0
	Channel_CHANNEL_STABLE      Channel = 1
	Channel_CHANNEL_BETA        Channel = 2
	Channel_CHANNEL_DEV         Channel = 3
	Channel_CHANNEL_CANARY      Channel = 4
)

var Channel_name = map[int32]string{
	0: "CHANNEL_UNSPECIFIED",
	1: "CHANNEL_STABLE",
	2: "CHANNEL_BETA",
	3: "CHANNEL_DEV",
	4: "CHANNEL_CANARY",
}

var Channel_value = map[string]int32{
	"CHANNEL_UNSPECIFIED": 0,
	"CHANNEL_STABLE":      1,
	"CHANNEL_BETA":        2,
	"CHANNEL_DEV":         3,
	"CHANNEL_CANARY":      4,
}

func (x Channel) String() string {
	return proto.EnumName(Channel_name, int32(x))
}

func (Channel) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{1}
}

// The available delta types.
type DeltaType int32

const (
	DeltaType_DELTA_UNKNOWN  DeltaType = 0
	DeltaType_NO_DELTA       DeltaType = 1
	DeltaType_FSI            DeltaType = 2
	DeltaType_MILESTONE      DeltaType = 3
	DeltaType_OMAHA          DeltaType = 4
	DeltaType_STEPPING_STONE DeltaType = 5
)

var DeltaType_name = map[int32]string{
	0: "DELTA_UNKNOWN",
	1: "NO_DELTA",
	2: "FSI",
	3: "MILESTONE",
	4: "OMAHA",
	5: "STEPPING_STONE",
}

var DeltaType_value = map[string]int32{
	"DELTA_UNKNOWN":  0,
	"NO_DELTA":       1,
	"FSI":            2,
	"MILESTONE":      3,
	"OMAHA":          4,
	"STEPPING_STONE": 5,
}

func (x DeltaType) String() string {
	return proto.EnumName(DeltaType_name, int32(x))
}

func (DeltaType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{2}
}

// TODO(crbug.com/1020615): Drop this from chromite/api/toolchain.proto (and
// here) once usage has migrated to BuilderConfig.Artifacts.ArtifactType.
// Meanwhile, keep this in sync with chromite/api/toolchain.proto.  The various
// toolchain optimization artifact types.
type AFDOArtifactType int32

const (
	// No AFDO artifact type specified.
	AFDOArtifactType_NONE_TYPE AFDOArtifactType = 0
	// The type is orderfile.
	AFDOArtifactType_ORDERFILE AFDOArtifactType = 1
	// The type is Chrome AFDO files generated by benchmarks.
	AFDOArtifactType_BENCHMARK_AFDO AFDOArtifactType = 2
	// The type is kernel AFDO files.
	AFDOArtifactType_KERNEL_AFDO AFDOArtifactType = 3
	// The type is Chrome AFDO used in release builders.
	AFDOArtifactType_CHROME_AFDO AFDOArtifactType = 4
)

var AFDOArtifactType_name = map[int32]string{
	0: "NONE_TYPE",
	1: "ORDERFILE",
	2: "BENCHMARK_AFDO",
	3: "KERNEL_AFDO",
	4: "CHROME_AFDO",
}

var AFDOArtifactType_value = map[string]int32{
	"NONE_TYPE":      0,
	"ORDERFILE":      1,
	"BENCHMARK_AFDO": 2,
	"KERNEL_AFDO":    3,
	"CHROME_AFDO":    4,
}

func (x AFDOArtifactType) String() string {
	return proto.EnumName(AFDOArtifactType_name, int32(x))
}

func (AFDOArtifactType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{3}
}

// Facilitates testing new Goma approaches before rolling them out
// more widely.
type GomaConfig_GomaApproach int32

const (
	GomaConfig_GOMA_APPROACH_UNSPECIFIED GomaConfig_GomaApproach = 0
	GomaConfig_DEFAULT                   GomaConfig_GomaApproach = 1
	GomaConfig_RBE_PROD                  GomaConfig_GomaApproach = 2
	GomaConfig_RBE_STAGING               GomaConfig_GomaApproach = 3
)

var GomaConfig_GomaApproach_name = map[int32]string{
	0: "GOMA_APPROACH_UNSPECIFIED",
	1: "DEFAULT",
	2: "RBE_PROD",
	3: "RBE_STAGING",
}

var GomaConfig_GomaApproach_value = map[string]int32{
	"GOMA_APPROACH_UNSPECIFIED": 0,
	"DEFAULT":                   1,
	"RBE_PROD":                  2,
	"RBE_STAGING":               3,
}

func (x GomaConfig_GomaApproach) String() string {
	return proto.EnumName(GomaConfig_GomaApproach_name, int32(x))
}

func (GomaConfig_GomaApproach) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{3, 0}
}

// Location enum; whether the resource is inside or outside of the chroot.
type Path_Location int32

const (
	Path_NO_LOCATION Path_Location = 0
	Path_INSIDE      Path_Location = 1
	Path_OUTSIDE     Path_Location = 2
)

var Path_Location_name = map[int32]string{
	0: "NO_LOCATION",
	1: "INSIDE",
	2: "OUTSIDE",
}

var Path_Location_value = map[string]int32{
	"NO_LOCATION": 0,
	"INSIDE":      1,
	"OUTSIDE":     2,
}

func (x Path_Location) String() string {
	return proto.EnumName(Path_Location_name, int32(x))
}

func (Path_Location) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{8, 0}
}

// Legacy artifacts, handled in cros_artifacts.  DO NOT ADD TO THIS.
type ArtifactsByService_Legacy_ArtifactType int32

const (
	ArtifactsByService_Legacy_UNSPECIFIED ArtifactsByService_Legacy_ArtifactType = 0
	// Indicates wanting a zip file of everything in the image directory.
	// TODO(crbug/1034529): moves to ArtifactsByService.Image
	ArtifactsByService_Legacy_IMAGE_ZIP ArtifactsByService_Legacy_ArtifactType = 1
	// Indicates wanting update payloads.
	// TODO(crbug/1034529): moves to ArtifactsByService.Test
	ArtifactsByService_Legacy_TEST_UPDATE_PAYLOAD ArtifactsByService_Legacy_ArtifactType = 2
	// Indicates wanting the autotest tarballs.
	// TODO(crbug/1034529): moves to ArtifactsByService.Test
	ArtifactsByService_Legacy_AUTOTEST_FILES ArtifactsByService_Legacy_ArtifactType = 3
	// Indicates wanting a tarball containing private TAST test bundles.
	// TODO(crbug/1034529): moves to ArtifactsByService.Test
	ArtifactsByService_Legacy_TAST_FILES ArtifactsByService_Legacy_ArtifactType = 4
	// Indicates wanting a tarball containing guest images and test bundles.
	// TODO(crbug/1034529): moves to ArtifactsByService.Test
	ArtifactsByService_Legacy_PINNED_GUEST_IMAGES ArtifactsByService_Legacy_ArtifactType = 5
	// Indicates wanting an archive of firmware images built from source.
	// TODO(crbug/1034529): moves to ArtifactsByService.Package
	ArtifactsByService_Legacy_FIRMWARE ArtifactsByService_Legacy_ArtifactType = 6
	// Indicates wanting a tarball of the Ebuilds logs.
	// TODO(crbug/1034529): moves to ArtifactsByService.Sysroot
	ArtifactsByService_Legacy_EBUILD_LOGS ArtifactsByService_Legacy_ArtifactType = 7
	// Indicates wanting an archive of the ChromeOS Config.
	// TODO(crbug/1034529): moves to ArtifactsByService.Sysroot
	ArtifactsByService_Legacy_CHROMEOS_CONFIG ArtifactsByService_Legacy_ArtifactType = 8
	// Indicates wanting the CPE report.
	// TODO(crbug/1034529): moves to ArtifactsByService.Package
	ArtifactsByService_Legacy_CPE_REPORT ArtifactsByService_Legacy_ArtifactType = 9
	// Indicates wanting a tar.xz archive for each image created.
	// TODO(crbug/1034529): moves to ArtifactsByService.Image
	ArtifactsByService_Legacy_IMAGE_ARCHIVES ArtifactsByService_Legacy_ArtifactType = 10
	// Indicates wanting a tarball containing fingerprint MCU test binaries.
	// TODO(crbug/1034529): moves to ArtifactsByService.Test
	ArtifactsByService_Legacy_FPMCU_UNITTESTS ArtifactsByService_Legacy_ArtifactType = 27
	// Indicates wanting a test image tarball suitable for importing into GCE.
	// TODO(crbug/1034529): moves to ArtifactsByService.Image
	ArtifactsByService_Legacy_GCE_TARBALL ArtifactsByService_Legacy_ArtifactType = 28
)

var ArtifactsByService_Legacy_ArtifactType_name = map[int32]string{
	0:  "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",
	27: "FPMCU_UNITTESTS",
	28: "GCE_TARBALL",
}

var ArtifactsByService_Legacy_ArtifactType_value = map[string]int32{
	"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,
	"FPMCU_UNITTESTS":     27,
	"GCE_TARBALL":         28,
}

func (x ArtifactsByService_Legacy_ArtifactType) String() string {
	return proto.EnumName(ArtifactsByService_Legacy_ArtifactType_name, int32(x))
}

func (ArtifactsByService_Legacy_ArtifactType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{18, 0, 0}
}

// Artifacts which the ArtifactsService endpoints pass to ToolchainService.
type ArtifactsByService_Toolchain_ArtifactType int32

const (
	ArtifactsByService_Toolchain_UNSPECIFIED ArtifactsByService_Toolchain_ArtifactType = 0
	// Indicates an unvetted orderfile for Chrome.
	ArtifactsByService_Toolchain_UNVERIFIED_CHROME_LLVM_ORDERFILE ArtifactsByService_Toolchain_ArtifactType = 11
	// Indicates a vetted orderfile for Chrome.
	ArtifactsByService_Toolchain_VERIFIED_CHROME_LLVM_ORDERFILE ArtifactsByService_Toolchain_ArtifactType = 12
	// Indicates a clang-tidy artifact.
	ArtifactsByService_Toolchain_CHROME_CLANG_WARNINGS_FILE ArtifactsByService_Toolchain_ArtifactType = 13
	// Indicates a PGO artifact for the compiler.
	ArtifactsByService_Toolchain_UNVERIFIED_LLVM_PGO_FILE ArtifactsByService_Toolchain_ArtifactType = 14
	// Indicates an unvetted AFDO Chrome profile.  (Generated by HW Tests in
	// the benchmark-afdo-generate builder.)
	ArtifactsByService_Toolchain_UNVERIFIED_CHROME_BENCHMARK_AFDO_FILE ArtifactsByService_Toolchain_ArtifactType = 15
	// Indicates a vetted AFDO Chrome profile.
	ArtifactsByService_Toolchain_VERIFIED_CHROME_BENCHMARK_AFDO_FILE ArtifactsByService_Toolchain_ArtifactType = 16
	// Indicates a vetted AFDO Kernel profile.
	ArtifactsByService_Toolchain_VERIFIED_KERNEL_CWP_AFDO_FILE ArtifactsByService_Toolchain_ArtifactType = 17
	// Indicates an unvetted AFDO Kernel CWP profile.
	ArtifactsByService_Toolchain_UNVERIFIED_KERNEL_CWP_AFDO_FILE ArtifactsByService_Toolchain_ArtifactType = 18
	// Indicates an unvetted AFDO Chrome CWP profile.
	ArtifactsByService_Toolchain_UNVERIFIED_CHROME_CWP_AFDO_FILE ArtifactsByService_Toolchain_ArtifactType = 19
	// Indicates a vetted AFDO Chrome CWP profile.
	ArtifactsByService_Toolchain_VERIFIED_CHROME_CWP_AFDO_FILE ArtifactsByService_Toolchain_ArtifactType = 20
	// Indicates a vetted AFDO profile for release.
	ArtifactsByService_Toolchain_VERIFIED_RELEASE_AFDO_FILE ArtifactsByService_Toolchain_ArtifactType = 21
	// Indicates an unvetted AFDO perf data file (from HW Test).
	ArtifactsByService_Toolchain_UNVERIFIED_CHROME_BENCHMARK_PERF_FILE ArtifactsByService_Toolchain_ArtifactType = 22
	// Indicates an unstripped Chrome binary.
	ArtifactsByService_Toolchain_CHROME_DEBUG_BINARY ArtifactsByService_Toolchain_ArtifactType = 23
	// Indicates toolchain logs for the compiler warnings for werror monitor
	ArtifactsByService_Toolchain_TOOLCHAIN_WARNING_LOGS ArtifactsByService_Toolchain_ArtifactType = 24
	// Indicates a prod Chrome AFDO profile for Android/Linux.
	ArtifactsByService_Toolchain_CHROME_AFDO_PROFILE_FOR_ANDROID_LINUX ArtifactsByService_Toolchain_ArtifactType = 25
	// Indicates diagnoses for Clang crashes
	ArtifactsByService_Toolchain_CLANG_CRASH_DIAGNOSES ArtifactsByService_Toolchain_ArtifactType = 26
)

var ArtifactsByService_Toolchain_ArtifactType_name = map[int32]string{
	0:  "UNSPECIFIED",
	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",
}

var ArtifactsByService_Toolchain_ArtifactType_value = map[string]int32{
	"UNSPECIFIED":                           0,
	"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,
}

func (x ArtifactsByService_Toolchain_ArtifactType) String() string {
	return proto.EnumName(ArtifactsByService_Toolchain_ArtifactType_name, int32(x))
}

func (ArtifactsByService_Toolchain_ArtifactType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{18, 1, 0}
}

// Artifacts which the ArtifactsService endpoints pass to ImageService.
type ArtifactsByService_Image_ArtifactType int32

const (
	ArtifactsByService_Image_UNSPECIFIED ArtifactsByService_Image_ArtifactType = 0
)

var ArtifactsByService_Image_ArtifactType_name = map[int32]string{
	0: "UNSPECIFIED",
}

var ArtifactsByService_Image_ArtifactType_value = map[string]int32{
	"UNSPECIFIED": 0,
}

func (x ArtifactsByService_Image_ArtifactType) String() string {
	return proto.EnumName(ArtifactsByService_Image_ArtifactType_name, int32(x))
}

func (ArtifactsByService_Image_ArtifactType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{18, 2, 0}
}

// Artifacts which the ArtifactsService endpoints pass to PackageService.
type ArtifactsByService_Package_ArtifactType int32

const (
	ArtifactsByService_Package_UNSPECIFIED ArtifactsByService_Package_ArtifactType = 0
)

var ArtifactsByService_Package_ArtifactType_name = map[int32]string{
	0: "UNSPECIFIED",
}

var ArtifactsByService_Package_ArtifactType_value = map[string]int32{
	"UNSPECIFIED": 0,
}

func (x ArtifactsByService_Package_ArtifactType) String() string {
	return proto.EnumName(ArtifactsByService_Package_ArtifactType_name, int32(x))
}

func (ArtifactsByService_Package_ArtifactType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{18, 3, 0}
}

// Artifacts which the ArtifactsService endpoints pass to SysrootService.
type ArtifactsByService_Sysroot_ArtifactType int32

const (
	ArtifactsByService_Sysroot_UNSPECIFIED ArtifactsByService_Sysroot_ArtifactType = 0
)

var ArtifactsByService_Sysroot_ArtifactType_name = map[int32]string{
	0: "UNSPECIFIED",
}

var ArtifactsByService_Sysroot_ArtifactType_value = map[string]int32{
	"UNSPECIFIED": 0,
}

func (x ArtifactsByService_Sysroot_ArtifactType) String() string {
	return proto.EnumName(ArtifactsByService_Sysroot_ArtifactType_name, int32(x))
}

func (ArtifactsByService_Sysroot_ArtifactType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{18, 4, 0}
}

// Artifacts which the ArtifactsService endpoints pass to TestService.
type ArtifactsByService_Test_ArtifactType int32

const (
	ArtifactsByService_Test_UNSPECIFIED ArtifactsByService_Test_ArtifactType = 0
)

var ArtifactsByService_Test_ArtifactType_name = map[int32]string{
	0: "UNSPECIFIED",
}

var ArtifactsByService_Test_ArtifactType_value = map[string]int32{
	"UNSPECIFIED": 0,
}

func (x ArtifactsByService_Test_ArtifactType) String() string {
	return proto.EnumName(ArtifactsByService_Test_ArtifactType_name, int32(x))
}

func (ArtifactsByService_Test_ArtifactType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{18, 5, 0}
}

// BuildTarget encapsulates a number of related arguments. At the moment, the
// usage of specific arguments is on a per endpoint basis, but will converge
// to support a standard set as time goes on.
// BuildTarget is a more appropriate name going forward for what we currently
// call "board".
type BuildTarget struct {
	// The name of the build target (a.k.a. board name).
	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_BuildTarget proto.InternalMessageInfo

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

// Chroot is used to define how to enter a chroot.
type Chroot struct {
	// The directory containing the chroot.
	Path string `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"`
	// The cache directory override.
	CacheDir string `protobuf:"bytes,2,opt,name=cache_dir,json=cacheDir,proto3" json:"cache_dir,omitempty"`
	// Environment configuration.
	Env *Chroot_ChrootEnv `protobuf:"bytes,3,opt,name=env,proto3" json:"env,omitempty"`
	// The directory where the chrome source should be mounted.
	ChromeDir            string   `protobuf:"bytes,4,opt,name=chrome_dir,json=chromeDir,proto3" json:"chrome_dir,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Chroot proto.InternalMessageInfo

func (m *Chroot) GetPath() string {
	if m != nil {
		return m.Path
	}
	return ""
}

func (m *Chroot) GetCacheDir() string {
	if m != nil {
		return m.CacheDir
	}
	return ""
}

func (m *Chroot) GetEnv() *Chroot_ChrootEnv {
	if m != nil {
		return m.Env
	}
	return nil
}

func (m *Chroot) GetChromeDir() string {
	if m != nil {
		return m.ChromeDir
	}
	return ""
}

type Chroot_ChrootEnv struct {
	// USE flags to set.
	UseFlags []*UseFlag `protobuf:"bytes,1,rep,name=use_flags,json=useFlags,proto3" json:"use_flags,omitempty"`
	// FEATURES flags to set.
	Features             []*Feature `protobuf:"bytes,2,rep,name=features,proto3" json:"features,omitempty"`
	XXX_NoUnkeyedLiteral struct{}   `json:"-"`
	XXX_unrecognized     []byte     `json:"-"`
	XXX_sizecache        int32      `json:"-"`
}

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

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

var xxx_messageInfo_Chroot_ChrootEnv proto.InternalMessageInfo

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

func (m *Chroot_ChrootEnv) GetFeatures() []*Feature {
	if m != nil {
		return m.Features
	}
	return nil
}

// FEATURES environment variable component message.
type Feature struct {
	Feature              string   `protobuf:"bytes,1,opt,name=feature,proto3" json:"feature,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Feature proto.InternalMessageInfo

func (m *Feature) GetFeature() string {
	if m != nil {
		return m.Feature
	}
	return ""
}

type GomaConfig struct {
	// The goma install location.
	// Required.
	GomaDir string `protobuf:"bytes,1,opt,name=goma_dir,json=gomaDir,proto3" json:"goma_dir,omitempty"`
	// The goma client credentials file.
	GomaClientJson string `protobuf:"bytes,2,opt,name=goma_client_json,json=gomaClientJson,proto3" json:"goma_client_json,omitempty"`
	// Path to the Goma client used for build package.
	// If None, goma_dir will be used instead.
	ChromeosGomaDir string                  `protobuf:"bytes,3,opt,name=chromeos_goma_dir,json=chromeosGomaDir,proto3" json:"chromeos_goma_dir,omitempty"`
	GomaApproach    GomaConfig_GomaApproach `protobuf:"varint,4,opt,name=goma_approach,json=gomaApproach,proto3,enum=chromiumos.GomaConfig_GomaApproach" json:"goma_approach,omitempty"`
	// The directory where the goma logs will be extracted.
	LogDir *SyncedDir `protobuf:"bytes,5,opt,name=log_dir,json=logDir,proto3" json:"log_dir,omitempty"`
	// The name of the goma stats file. It will be dumped inside log_dir.
	StatsFile string `protobuf:"bytes,6,opt,name=stats_file,json=statsFile,proto3" json:"stats_file,omitempty"`
	// The name of the goma counterz file. It will be dumped inside log_dir.
	CounterzFile         string   `protobuf:"bytes,7,opt,name=counterz_file,json=counterzFile,proto3" json:"counterz_file,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_GomaConfig proto.InternalMessageInfo

func (m *GomaConfig) GetGomaDir() string {
	if m != nil {
		return m.GomaDir
	}
	return ""
}

func (m *GomaConfig) GetGomaClientJson() string {
	if m != nil {
		return m.GomaClientJson
	}
	return ""
}

func (m *GomaConfig) GetChromeosGomaDir() string {
	if m != nil {
		return m.ChromeosGomaDir
	}
	return ""
}

func (m *GomaConfig) GetGomaApproach() GomaConfig_GomaApproach {
	if m != nil {
		return m.GomaApproach
	}
	return GomaConfig_GOMA_APPROACH_UNSPECIFIED
}

func (m *GomaConfig) GetLogDir() *SyncedDir {
	if m != nil {
		return m.LogDir
	}
	return nil
}

func (m *GomaConfig) GetStatsFile() string {
	if m != nil {
		return m.StatsFile
	}
	return ""
}

func (m *GomaConfig) GetCounterzFile() string {
	if m != nil {
		return m.CounterzFile
	}
	return ""
}

type GomaArtifacts struct {
	// Goma stats file.
	StatsFile string `protobuf:"bytes,1,opt,name=stats_file,json=statsFile,proto3" json:"stats_file,omitempty"`
	// Goma counterz file.
	CounterzFile string `protobuf:"bytes,2,opt,name=counterz_file,json=counterzFile,proto3" json:"counterz_file,omitempty"`
	// Goma log files.
	LogFiles             []string `protobuf:"bytes,3,rep,name=log_files,json=logFiles,proto3" json:"log_files,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_GomaArtifacts proto.InternalMessageInfo

func (m *GomaArtifacts) GetStatsFile() string {
	if m != nil {
		return m.StatsFile
	}
	return ""
}

func (m *GomaArtifacts) GetCounterzFile() string {
	if m != nil {
		return m.CounterzFile
	}
	return ""
}

func (m *GomaArtifacts) GetLogFiles() []string {
	if m != nil {
		return m.LogFiles
	}
	return nil
}

// Message describing a package, The corresponding variable names are from
// https://devmanual.gentoo.org/ebuild-writing/variables/index.html
type PackageInfo struct {
	// The package name (PN variable).
	PackageName string `protobuf:"bytes,1,opt,name=package_name,json=packageName,proto3" json:"package_name,omitempty"`
	// The package category (CATEGORY variable).
	Category string `protobuf:"bytes,2,opt,name=category,proto3" json:"category,omitempty"`
	// The package version and revision (PVR variable).
	Version              string   `protobuf:"bytes,3,opt,name=version,proto3" json:"version,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_PackageInfo proto.InternalMessageInfo

func (m *PackageInfo) GetPackageName() string {
	if m != nil {
		return m.PackageName
	}
	return ""
}

func (m *PackageInfo) GetCategory() string {
	if m != nil {
		return m.Category
	}
	return ""
}

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

// Information about the sysroot's profile.
type Profile struct {
	// The name of the profile.
	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Profile proto.InternalMessageInfo

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

// Message describing a package index (binhost) file.
type PackageIndexInfo struct {
	// The snapshot SHA
	SnapshotSha string `protobuf:"bytes,1,opt,name=snapshot_sha,json=snapshotSha,proto3" json:"snapshot_sha,omitempty"`
	// The snapshot number.  Higher is newer.
	SnapshotNumber int32 `protobuf:"varint,2,opt,name=snapshot_number,json=snapshotNumber,proto3" json:"snapshot_number,omitempty"`
	// The build target.
	BuildTarget *BuildTarget `protobuf:"bytes,3,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	// The full URI of the package index file.
	Location string `protobuf:"bytes,4,opt,name=location,proto3" json:"location,omitempty"`
	// The sysroot profile.
	Profile              *Profile `protobuf:"bytes,5,opt,name=profile,proto3" json:"profile,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *PackageIndexInfo) Reset()         { *m = PackageIndexInfo{} }
func (m *PackageIndexInfo) String() string { return proto.CompactTextString(m) }
func (*PackageIndexInfo) ProtoMessage()    {}
func (*PackageIndexInfo) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{7}
}

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

var xxx_messageInfo_PackageIndexInfo proto.InternalMessageInfo

func (m *PackageIndexInfo) GetSnapshotSha() string {
	if m != nil {
		return m.SnapshotSha
	}
	return ""
}

func (m *PackageIndexInfo) GetSnapshotNumber() int32 {
	if m != nil {
		return m.SnapshotNumber
	}
	return 0
}

func (m *PackageIndexInfo) GetBuildTarget() *BuildTarget {
	if m != nil {
		return m.BuildTarget
	}
	return nil
}

func (m *PackageIndexInfo) GetLocation() string {
	if m != nil {
		return m.Location
	}
	return ""
}

func (m *PackageIndexInfo) GetProfile() *Profile {
	if m != nil {
		return m.Profile
	}
	return nil
}

// A message to clarify inside/outside chroot paths.
type Path struct {
	// The path to the resource.
	Path string `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"`
	// The path location.
	Location             Path_Location `protobuf:"varint,2,opt,name=location,proto3,enum=chromiumos.Path_Location" json:"location,omitempty"`
	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
	XXX_unrecognized     []byte        `json:"-"`
	XXX_sizecache        int32         `json:"-"`
}

func (m *Path) Reset()         { *m = Path{} }
func (m *Path) String() string { return proto.CompactTextString(m) }
func (*Path) ProtoMessage()    {}
func (*Path) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{8}
}

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

var xxx_messageInfo_Path proto.InternalMessageInfo

func (m *Path) GetPath() string {
	if m != nil {
		return m.Path
	}
	return ""
}

func (m *Path) GetLocation() Path_Location {
	if m != nil {
		return m.Location
	}
	return Path_NO_LOCATION
}

// A message used to indicate an output location for results. Specifically,
// this is used to automatically transfer files out of the chroot when needed.
// Note: No more than one ResultPath per message can be supported.
type ResultPath struct {
	// Required.
	// The result directory information.
	Path                 *Path    `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ResultPath) Reset()         { *m = ResultPath{} }
func (m *ResultPath) String() string { return proto.CompactTextString(m) }
func (*ResultPath) ProtoMessage()    {}
func (*ResultPath) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{9}
}

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

var xxx_messageInfo_ResultPath proto.InternalMessageInfo

func (m *ResultPath) GetPath() *Path {
	if m != nil {
		return m.Path
	}
	return nil
}

// A SyncedDir will have all of its contents transferred into a tmp directory
// in the chroot before the endpoint is called, and afterwords its contents
// will be exactly what was in the tmp directory when the endpoint completed.
type SyncedDir struct {
	// Required.
	// The directory being synced.
	Dir                  string   `protobuf:"bytes,1,opt,name=dir,proto3" json:"dir,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *SyncedDir) Reset()         { *m = SyncedDir{} }
func (m *SyncedDir) String() string { return proto.CompactTextString(m) }
func (*SyncedDir) ProtoMessage()    {}
func (*SyncedDir) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{10}
}

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

var xxx_messageInfo_SyncedDir proto.InternalMessageInfo

func (m *SyncedDir) GetDir() string {
	if m != nil {
		return m.Dir
	}
	return ""
}

// See also crrev.com/c/1929452 and:
//   https://cs.corp.google.com/piper///depot/google3/third_party/luci/buildbucket/proto/common.proto?l=147-176&rcl=257714215
// A Gerrit patchset.
type GerritChange struct {
	// Gerrit hostname, e.g. "chromium-review.googlesource.com".
	Host string `protobuf:"bytes,1,opt,name=host,proto3" json:"host,omitempty"`
	// Gerrit project, e.g. "chromium/src".
	Project string `protobuf:"bytes,2,opt,name=project,proto3" json:"project,omitempty"`
	// Change number, e.g. 12345.
	Change int64 `protobuf:"varint,3,opt,name=change,proto3" json:"change,omitempty"`
	// Patch set number, e.g. 1.
	Patchset             int64    `protobuf:"varint,4,opt,name=patchset,proto3" json:"patchset,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *GerritChange) Reset()         { *m = GerritChange{} }
func (m *GerritChange) String() string { return proto.CompactTextString(m) }
func (*GerritChange) ProtoMessage()    {}
func (*GerritChange) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{11}
}

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

var xxx_messageInfo_GerritChange proto.InternalMessageInfo

func (m *GerritChange) GetHost() string {
	if m != nil {
		return m.Host
	}
	return ""
}

func (m *GerritChange) GetProject() string {
	if m != nil {
		return m.Project
	}
	return ""
}

func (m *GerritChange) GetChange() int64 {
	if m != nil {
		return m.Change
	}
	return 0
}

func (m *GerritChange) GetPatchset() int64 {
	if m != nil {
		return m.Patchset
	}
	return 0
}

type GitilesCommit struct {
	// Gitiles hostname, e.g. "chromium.googlesource.com".
	Host string `protobuf:"bytes,1,opt,name=host,proto3" json:"host,omitempty"`
	// Repository name on the host, e.g. "chromium/src".
	Project string `protobuf:"bytes,2,opt,name=project,proto3" json:"project,omitempty"`
	// Commit HEX SHA1.
	Id string `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"`
	// Commit ref, e.g. "refs/heads/master".
	// NOT a branch name: if specified, must start with "refs/".
	Ref string `protobuf:"bytes,4,opt,name=ref,proto3" json:"ref,omitempty"`
	// Defines a total order of commits on the ref. Requires ref field.
	Position             uint32   `protobuf:"varint,5,opt,name=position,proto3" json:"position,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *GitilesCommit) Reset()         { *m = GitilesCommit{} }
func (m *GitilesCommit) String() string { return proto.CompactTextString(m) }
func (*GitilesCommit) ProtoMessage()    {}
func (*GitilesCommit) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{12}
}

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

var xxx_messageInfo_GitilesCommit proto.InternalMessageInfo

func (m *GitilesCommit) GetHost() string {
	if m != nil {
		return m.Host
	}
	return ""
}

func (m *GitilesCommit) GetProject() string {
	if m != nil {
		return m.Project
	}
	return ""
}

func (m *GitilesCommit) GetId() string {
	if m != nil {
		return m.Id
	}
	return ""
}

func (m *GitilesCommit) GetRef() string {
	if m != nil {
		return m.Ref
	}
	return ""
}

func (m *GitilesCommit) GetPosition() uint32 {
	if m != nil {
		return m.Position
	}
	return 0
}

// Message for USE flags.
type UseFlag struct {
	// The use flag.
	Flag                 string   `protobuf:"bytes,1,opt,name=flag,proto3" json:"flag,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *UseFlag) Reset()         { *m = UseFlag{} }
func (m *UseFlag) String() string { return proto.CompactTextString(m) }
func (*UseFlag) ProtoMessage()    {}
func (*UseFlag) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{13}
}

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

var xxx_messageInfo_UseFlag proto.InternalMessageInfo

func (m *UseFlag) GetFlag() string {
	if m != nil {
		return m.Flag
	}
	return ""
}

// A wrapper around a serialized protocol buffer.
type ProtoBytes struct {
	SerializedProto      []byte   `protobuf:"bytes,1,opt,name=serialized_proto,json=serializedProto,proto3" json:"serialized_proto,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ProtoBytes) Reset()         { *m = ProtoBytes{} }
func (m *ProtoBytes) String() string { return proto.CompactTextString(m) }
func (*ProtoBytes) ProtoMessage()    {}
func (*ProtoBytes) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{14}
}

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

var xxx_messageInfo_ProtoBytes proto.InternalMessageInfo

func (m *ProtoBytes) GetSerializedProto() []byte {
	if m != nil {
		return m.SerializedProto
	}
	return nil
}

// Additional information about artifacts used by PrepareForBuild endpoints.
// TODO(crbug/1019868): This is migrating to ArtifactProfileInfo.
type PrepareForBuildAdditionalArgs struct {
	// Types that are valid to be assigned to PrepareForBuildArgs:
	//	*PrepareForBuildAdditionalArgs_ChromeCwpProfile
	//	*PrepareForBuildAdditionalArgs_KernelVersion
	PrepareForBuildArgs  isPrepareForBuildAdditionalArgs_PrepareForBuildArgs `protobuf_oneof:"prepare_for_build_args"`
	XXX_NoUnkeyedLiteral struct{}                                            `json:"-"`
	XXX_unrecognized     []byte                                              `json:"-"`
	XXX_sizecache        int32                                               `json:"-"`
}

func (m *PrepareForBuildAdditionalArgs) Reset()         { *m = PrepareForBuildAdditionalArgs{} }
func (m *PrepareForBuildAdditionalArgs) String() string { return proto.CompactTextString(m) }
func (*PrepareForBuildAdditionalArgs) ProtoMessage()    {}
func (*PrepareForBuildAdditionalArgs) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{15}
}

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

var xxx_messageInfo_PrepareForBuildAdditionalArgs proto.InternalMessageInfo

type isPrepareForBuildAdditionalArgs_PrepareForBuildArgs interface {
	isPrepareForBuildAdditionalArgs_PrepareForBuildArgs()
}

type PrepareForBuildAdditionalArgs_ChromeCwpProfile struct {
	ChromeCwpProfile string `protobuf:"bytes,1,opt,name=chrome_cwp_profile,json=chromeCwpProfile,proto3,oneof"`
}

type PrepareForBuildAdditionalArgs_KernelVersion struct {
	KernelVersion string `protobuf:"bytes,2,opt,name=kernel_version,json=kernelVersion,proto3,oneof"`
}

func (*PrepareForBuildAdditionalArgs_ChromeCwpProfile) isPrepareForBuildAdditionalArgs_PrepareForBuildArgs() {
}

func (*PrepareForBuildAdditionalArgs_KernelVersion) isPrepareForBuildAdditionalArgs_PrepareForBuildArgs() {
}

func (m *PrepareForBuildAdditionalArgs) GetPrepareForBuildArgs() isPrepareForBuildAdditionalArgs_PrepareForBuildArgs {
	if m != nil {
		return m.PrepareForBuildArgs
	}
	return nil
}

func (m *PrepareForBuildAdditionalArgs) GetChromeCwpProfile() string {
	if x, ok := m.GetPrepareForBuildArgs().(*PrepareForBuildAdditionalArgs_ChromeCwpProfile); ok {
		return x.ChromeCwpProfile
	}
	return ""
}

func (m *PrepareForBuildAdditionalArgs) GetKernelVersion() string {
	if x, ok := m.GetPrepareForBuildArgs().(*PrepareForBuildAdditionalArgs_KernelVersion); ok {
		return x.KernelVersion
	}
	return ""
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*PrepareForBuildAdditionalArgs) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*PrepareForBuildAdditionalArgs_ChromeCwpProfile)(nil),
		(*PrepareForBuildAdditionalArgs_KernelVersion)(nil),
	}
}

// ToolchainService Unverified Release AFDO artifacts require information
// about the builder that created the image used to generate the unverified
// chrome benchmark perf file.
type AfdoRelease struct {
	// ToolchainService Chrome AFDO artifacts require profile name.
	ChromeCwpProfile string `protobuf:"bytes,1,opt,name=chrome_cwp_profile,json=chromeCwpProfile,proto3" json:"chrome_cwp_profile,omitempty"`
	// The build id of the image_build.  Used to generate the location for the
	// image archive.
	ImageBuildId         int64    `protobuf:"varint,2,opt,name=image_build_id,json=imageBuildId,proto3" json:"image_build_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *AfdoRelease) Reset()         { *m = AfdoRelease{} }
func (m *AfdoRelease) String() string { return proto.CompactTextString(m) }
func (*AfdoRelease) ProtoMessage()    {}
func (*AfdoRelease) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{16}
}

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

var xxx_messageInfo_AfdoRelease proto.InternalMessageInfo

func (m *AfdoRelease) GetChromeCwpProfile() string {
	if m != nil {
		return m.ChromeCwpProfile
	}
	return ""
}

func (m *AfdoRelease) GetImageBuildId() int64 {
	if m != nil {
		return m.ImageBuildId
	}
	return 0
}

// Artifact profile information used by artifact prepare/bundle endpoints in
// addition to input_artifacts.
type ArtifactProfileInfo struct {
	// Types that are valid to be assigned to ArtifactProfileInfo:
	//	*ArtifactProfileInfo_ChromeCwpProfile
	//	*ArtifactProfileInfo_KernelVersion
	//	*ArtifactProfileInfo_AfdoRelease
	ArtifactProfileInfo  isArtifactProfileInfo_ArtifactProfileInfo `protobuf_oneof:"artifact_profile_info"`
	XXX_NoUnkeyedLiteral struct{}                                  `json:"-"`
	XXX_unrecognized     []byte                                    `json:"-"`
	XXX_sizecache        int32                                     `json:"-"`
}

func (m *ArtifactProfileInfo) Reset()         { *m = ArtifactProfileInfo{} }
func (m *ArtifactProfileInfo) String() string { return proto.CompactTextString(m) }
func (*ArtifactProfileInfo) ProtoMessage()    {}
func (*ArtifactProfileInfo) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{17}
}

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

var xxx_messageInfo_ArtifactProfileInfo proto.InternalMessageInfo

type isArtifactProfileInfo_ArtifactProfileInfo interface {
	isArtifactProfileInfo_ArtifactProfileInfo()
}

type ArtifactProfileInfo_ChromeCwpProfile struct {
	ChromeCwpProfile string `protobuf:"bytes,1,opt,name=chrome_cwp_profile,json=chromeCwpProfile,proto3,oneof"`
}

type ArtifactProfileInfo_KernelVersion struct {
	KernelVersion string `protobuf:"bytes,2,opt,name=kernel_version,json=kernelVersion,proto3,oneof"`
}

type ArtifactProfileInfo_AfdoRelease struct {
	AfdoRelease *AfdoRelease `protobuf:"bytes,3,opt,name=afdo_release,json=afdoRelease,proto3,oneof"`
}

func (*ArtifactProfileInfo_ChromeCwpProfile) isArtifactProfileInfo_ArtifactProfileInfo() {}

func (*ArtifactProfileInfo_KernelVersion) isArtifactProfileInfo_ArtifactProfileInfo() {}

func (*ArtifactProfileInfo_AfdoRelease) isArtifactProfileInfo_ArtifactProfileInfo() {}

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

func (m *ArtifactProfileInfo) GetChromeCwpProfile() string {
	if x, ok := m.GetArtifactProfileInfo().(*ArtifactProfileInfo_ChromeCwpProfile); ok {
		return x.ChromeCwpProfile
	}
	return ""
}

func (m *ArtifactProfileInfo) GetKernelVersion() string {
	if x, ok := m.GetArtifactProfileInfo().(*ArtifactProfileInfo_KernelVersion); ok {
		return x.KernelVersion
	}
	return ""
}

func (m *ArtifactProfileInfo) GetAfdoRelease() *AfdoRelease {
	if x, ok := m.GetArtifactProfileInfo().(*ArtifactProfileInfo_AfdoRelease); ok {
		return x.AfdoRelease
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*ArtifactProfileInfo) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*ArtifactProfileInfo_ChromeCwpProfile)(nil),
		(*ArtifactProfileInfo_KernelVersion)(nil),
		(*ArtifactProfileInfo_AfdoRelease)(nil),
	}
}

// Artifact information. Used bythe  ArtifactsService.PrepareForBuild and
// BundleArtifacts endpoints to dispatch the appropriate service routines to
// prepare or bundle as a batch.
type ArtifactsByService struct {
	Legacy    *ArtifactsByService_Legacy    `protobuf:"bytes,1,opt,name=legacy,proto3" json:"legacy,omitempty"`
	Toolchain *ArtifactsByService_Toolchain `protobuf:"bytes,2,opt,name=toolchain,proto3" json:"toolchain,omitempty"`
	Image     *ArtifactsByService_Image     `protobuf:"bytes,3,opt,name=image,proto3" json:"image,omitempty"`
	Package   *ArtifactsByService_Package   `protobuf:"bytes,4,opt,name=package,proto3" json:"package,omitempty"`
	Sysroot   *ArtifactsByService_Sysroot   `protobuf:"bytes,5,opt,name=sysroot,proto3" json:"sysroot,omitempty"`
	Test      *ArtifactsByService_Test      `protobuf:"bytes,6,opt,name=test,proto3" json:"test,omitempty"`
	// Profile information needed by the artifact handler, if any.
	ProfileInfo          *ArtifactProfileInfo `protobuf:"bytes,7,opt,name=profile_info,json=profileInfo,proto3" json:"profile_info,omitempty"`
	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
	XXX_unrecognized     []byte               `json:"-"`
	XXX_sizecache        int32                `json:"-"`
}

func (m *ArtifactsByService) Reset()         { *m = ArtifactsByService{} }
func (m *ArtifactsByService) String() string { return proto.CompactTextString(m) }
func (*ArtifactsByService) ProtoMessage()    {}
func (*ArtifactsByService) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{18}
}

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

var xxx_messageInfo_ArtifactsByService proto.InternalMessageInfo

func (m *ArtifactsByService) GetLegacy() *ArtifactsByService_Legacy {
	if m != nil {
		return m.Legacy
	}
	return nil
}

func (m *ArtifactsByService) GetToolchain() *ArtifactsByService_Toolchain {
	if m != nil {
		return m.Toolchain
	}
	return nil
}

func (m *ArtifactsByService) GetImage() *ArtifactsByService_Image {
	if m != nil {
		return m.Image
	}
	return nil
}

func (m *ArtifactsByService) GetPackage() *ArtifactsByService_Package {
	if m != nil {
		return m.Package
	}
	return nil
}

func (m *ArtifactsByService) GetSysroot() *ArtifactsByService_Sysroot {
	if m != nil {
		return m.Sysroot
	}
	return nil
}

func (m *ArtifactsByService) GetTest() *ArtifactsByService_Test {
	if m != nil {
		return m.Test
	}
	return nil
}

func (m *ArtifactsByService) GetProfileInfo() *ArtifactProfileInfo {
	if m != nil {
		return m.ProfileInfo
	}
	return nil
}

// TODO(crbug/1034529): Drop this message.
// Artifacts handled within the ArtifactsService endpoints directly.
type ArtifactsByService_Legacy struct {
	// Input artifact information
	InputArtifacts []*ArtifactsByService_Legacy_ArtifactInfo `protobuf:"bytes,1,rep,name=input_artifacts,json=inputArtifacts,proto3" json:"input_artifacts,omitempty"`
	// Output artifact information
	OutputArtifacts      []*ArtifactsByService_Legacy_ArtifactInfo `protobuf:"bytes,2,rep,name=output_artifacts,json=outputArtifacts,proto3" json:"output_artifacts,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                  `json:"-"`
	XXX_unrecognized     []byte                                    `json:"-"`
	XXX_sizecache        int32                                     `json:"-"`
}

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

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

var xxx_messageInfo_ArtifactsByService_Legacy proto.InternalMessageInfo

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

func (m *ArtifactsByService_Legacy) GetOutputArtifacts() []*ArtifactsByService_Legacy_ArtifactInfo {
	if m != nil {
		return m.OutputArtifacts
	}
	return nil
}

// Information about one or more artifacts.
type ArtifactsByService_Legacy_ArtifactInfo struct {
	// The ArtifactType.  One or more types to which the rest of the fields
	// apply.
	ArtifactTypes []ArtifactsByService_Legacy_ArtifactType `protobuf:"varint,1,rep,packed,name=artifact_types,json=artifactTypes,proto3,enum=chromiumos.ArtifactsByService_Legacy_ArtifactType" json:"artifact_types,omitempty"`
	// GS location in which to upload 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.
	//
	// BuilderConfig.Artifacts.artifacts_gs_location is used for all
	// artifacts.  Artifact can be published to additional locations by
	// specifying those here.  Examples: include AFDO artifacts and Release
	// images.
	GsLocations []string `protobuf:"bytes,2,rep,name=gs_locations,json=gsLocations,proto3" json:"gs_locations,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 *ArtifactsByService_Legacy_ArtifactInfo) Reset() {
	*m = ArtifactsByService_Legacy_ArtifactInfo{}
}
func (m *ArtifactsByService_Legacy_ArtifactInfo) String() string { return proto.CompactTextString(m) }
func (*ArtifactsByService_Legacy_ArtifactInfo) ProtoMessage()    {}
func (*ArtifactsByService_Legacy_ArtifactInfo) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{18, 0, 0}
}

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

var xxx_messageInfo_ArtifactsByService_Legacy_ArtifactInfo proto.InternalMessageInfo

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

func (m *ArtifactsByService_Legacy_ArtifactInfo) GetGsLocations() []string {
	if m != nil {
		return m.GsLocations
	}
	return nil
}

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

type ArtifactsByService_Toolchain struct {
	// Input artifact information
	InputArtifacts []*ArtifactsByService_Toolchain_ArtifactInfo `protobuf:"bytes,1,rep,name=input_artifacts,json=inputArtifacts,proto3" json:"input_artifacts,omitempty"`
	// Output artifact information
	OutputArtifacts      []*ArtifactsByService_Toolchain_ArtifactInfo `protobuf:"bytes,2,rep,name=output_artifacts,json=outputArtifacts,proto3" json:"output_artifacts,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                     `json:"-"`
	XXX_unrecognized     []byte                                       `json:"-"`
	XXX_sizecache        int32                                        `json:"-"`
}

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

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

var xxx_messageInfo_ArtifactsByService_Toolchain proto.InternalMessageInfo

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

func (m *ArtifactsByService_Toolchain) GetOutputArtifacts() []*ArtifactsByService_Toolchain_ArtifactInfo {
	if m != nil {
		return m.OutputArtifacts
	}
	return nil
}

// Information about one or more artifacts.  This should match the rest of
// the ArtifactInfo definitions in ArtifactsByService, other than having
// it's own (service-specific) definition for ArtifactType.
type ArtifactsByService_Toolchain_ArtifactInfo struct {
	// The ArtifactType.  One or more types to which the rest of the fields
	// apply.
	ArtifactTypes []ArtifactsByService_Toolchain_ArtifactType `protobuf:"varint,1,rep,packed,name=artifact_types,json=artifactTypes,proto3,enum=chromiumos.ArtifactsByService_Toolchain_ArtifactType" json:"artifact_types,omitempty"`
	// GS location in which to upload 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.
	// specifying those here.  Examples include AFDO artifacts and release
	//   %(artifact_name)s: The name of the artifact being published.
	//
	// BuilderConfig.Artifacts.artifacts_gs_location is used for all
	// artifacts.  Artifact can be published to additional locations by
	// specifying those here.  Examples: include AFDO artifacts and Release
	// images.
	GsLocations []string `protobuf:"bytes,2,rep,name=gs_locations,json=gsLocations,proto3" json:"gs_locations,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 *ArtifactsByService_Toolchain_ArtifactInfo) Reset() {
	*m = ArtifactsByService_Toolchain_ArtifactInfo{}
}
func (m *ArtifactsByService_Toolchain_ArtifactInfo) String() string { return proto.CompactTextString(m) }
func (*ArtifactsByService_Toolchain_ArtifactInfo) ProtoMessage()    {}
func (*ArtifactsByService_Toolchain_ArtifactInfo) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{18, 1, 0}
}

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

var xxx_messageInfo_ArtifactsByService_Toolchain_ArtifactInfo proto.InternalMessageInfo

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

func (m *ArtifactsByService_Toolchain_ArtifactInfo) GetGsLocations() []string {
	if m != nil {
		return m.GsLocations
	}
	return nil
}

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

type ArtifactsByService_Image struct {
	// Input artifact information
	InputArtifacts []*ArtifactsByService_Image_ArtifactInfo `protobuf:"bytes,1,rep,name=input_artifacts,json=inputArtifacts,proto3" json:"input_artifacts,omitempty"`
	// Output artifact information
	OutputArtifacts      []*ArtifactsByService_Image_ArtifactInfo `protobuf:"bytes,2,rep,name=output_artifacts,json=outputArtifacts,proto3" json:"output_artifacts,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                 `json:"-"`
	XXX_unrecognized     []byte                                   `json:"-"`
	XXX_sizecache        int32                                    `json:"-"`
}

func (m *ArtifactsByService_Image) Reset()         { *m = ArtifactsByService_Image{} }
func (m *ArtifactsByService_Image) String() string { return proto.CompactTextString(m) }
func (*ArtifactsByService_Image) ProtoMessage()    {}
func (*ArtifactsByService_Image) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{18, 2}
}

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

var xxx_messageInfo_ArtifactsByService_Image proto.InternalMessageInfo

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

func (m *ArtifactsByService_Image) GetOutputArtifacts() []*ArtifactsByService_Image_ArtifactInfo {
	if m != nil {
		return m.OutputArtifacts
	}
	return nil
}

// Information about one or more artifacts.  This should match the rest of
// the ArtifactInfo definitions in ArtifactsByService, other than having
// it's own (service-specific) definition for ArtifactType.
type ArtifactsByService_Image_ArtifactInfo struct {
	// The ArtifactType.  One or more types to which the rest of the fields
	// apply.
	ArtifactTypes []ArtifactsByService_Image_ArtifactType `protobuf:"varint,1,rep,packed,name=artifact_types,json=artifactTypes,proto3,enum=chromiumos.ArtifactsByService_Image_ArtifactType" json:"artifact_types,omitempty"`
	// GS location in which to upload 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.
	//
	// BuilderConfig.Artifacts.artifacts_gs_location is used for all
	// artifacts.  Artifact can be published to additional locations by
	// specifying those here.  Examples: include AFDO artifacts and Release
	// images.
	GsLocations []string `protobuf:"bytes,2,rep,name=gs_locations,json=gsLocations,proto3" json:"gs_locations,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 *ArtifactsByService_Image_ArtifactInfo) Reset()         { *m = ArtifactsByService_Image_ArtifactInfo{} }
func (m *ArtifactsByService_Image_ArtifactInfo) String() string { return proto.CompactTextString(m) }
func (*ArtifactsByService_Image_ArtifactInfo) ProtoMessage()    {}
func (*ArtifactsByService_Image_ArtifactInfo) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{18, 2, 0}
}

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

var xxx_messageInfo_ArtifactsByService_Image_ArtifactInfo proto.InternalMessageInfo

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

func (m *ArtifactsByService_Image_ArtifactInfo) GetGsLocations() []string {
	if m != nil {
		return m.GsLocations
	}
	return nil
}

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

type ArtifactsByService_Package struct {
	// Input artifact information
	InputArtifacts []*ArtifactsByService_Package_ArtifactInfo `protobuf:"bytes,1,rep,name=input_artifacts,json=inputArtifacts,proto3" json:"input_artifacts,omitempty"`
	// Output artifact information
	OutputArtifacts      []*ArtifactsByService_Package_ArtifactInfo `protobuf:"bytes,2,rep,name=output_artifacts,json=outputArtifacts,proto3" json:"output_artifacts,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                   `json:"-"`
	XXX_unrecognized     []byte                                     `json:"-"`
	XXX_sizecache        int32                                      `json:"-"`
}

func (m *ArtifactsByService_Package) Reset()         { *m = ArtifactsByService_Package{} }
func (m *ArtifactsByService_Package) String() string { return proto.CompactTextString(m) }
func (*ArtifactsByService_Package) ProtoMessage()    {}
func (*ArtifactsByService_Package) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{18, 3}
}

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

var xxx_messageInfo_ArtifactsByService_Package proto.InternalMessageInfo

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

func (m *ArtifactsByService_Package) GetOutputArtifacts() []*ArtifactsByService_Package_ArtifactInfo {
	if m != nil {
		return m.OutputArtifacts
	}
	return nil
}

// Information about one or more artifacts.  This should match the rest of
// the ArtifactInfo definitions in ArtifactsByService, other than having
// it's own (service-specific) definition for ArtifactType.
type ArtifactsByService_Package_ArtifactInfo struct {
	// The ArtifactType.  One or more types to which the rest of the fields
	// apply.
	ArtifactTypes []ArtifactsByService_Package_ArtifactType `protobuf:"varint,1,rep,packed,name=artifact_types,json=artifactTypes,proto3,enum=chromiumos.ArtifactsByService_Package_ArtifactType" json:"artifact_types,omitempty"`
	// GS location in which to upload 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.
	//
	// BuilderConfig.Artifacts.artifacts_gs_location is used for all
	// artifacts.  Artifact can be published to additional locations by
	// specifying those here.  Examples: include AFDO artifacts and Release
	// images.
	GsLocations []string `protobuf:"bytes,2,rep,name=gs_locations,json=gsLocations,proto3" json:"gs_locations,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 *ArtifactsByService_Package_ArtifactInfo) Reset() {
	*m = ArtifactsByService_Package_ArtifactInfo{}
}
func (m *ArtifactsByService_Package_ArtifactInfo) String() string { return proto.CompactTextString(m) }
func (*ArtifactsByService_Package_ArtifactInfo) ProtoMessage()    {}
func (*ArtifactsByService_Package_ArtifactInfo) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{18, 3, 0}
}

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

var xxx_messageInfo_ArtifactsByService_Package_ArtifactInfo proto.InternalMessageInfo

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

func (m *ArtifactsByService_Package_ArtifactInfo) GetGsLocations() []string {
	if m != nil {
		return m.GsLocations
	}
	return nil
}

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

type ArtifactsByService_Sysroot struct {
	// Input artifact information
	InputArtifacts []*ArtifactsByService_Sysroot_ArtifactInfo `protobuf:"bytes,1,rep,name=input_artifacts,json=inputArtifacts,proto3" json:"input_artifacts,omitempty"`
	// Output artifact information
	OutputArtifacts      []*ArtifactsByService_Sysroot_ArtifactInfo `protobuf:"bytes,2,rep,name=output_artifacts,json=outputArtifacts,proto3" json:"output_artifacts,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                   `json:"-"`
	XXX_unrecognized     []byte                                     `json:"-"`
	XXX_sizecache        int32                                      `json:"-"`
}

func (m *ArtifactsByService_Sysroot) Reset()         { *m = ArtifactsByService_Sysroot{} }
func (m *ArtifactsByService_Sysroot) String() string { return proto.CompactTextString(m) }
func (*ArtifactsByService_Sysroot) ProtoMessage()    {}
func (*ArtifactsByService_Sysroot) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{18, 4}
}

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

var xxx_messageInfo_ArtifactsByService_Sysroot proto.InternalMessageInfo

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

func (m *ArtifactsByService_Sysroot) GetOutputArtifacts() []*ArtifactsByService_Sysroot_ArtifactInfo {
	if m != nil {
		return m.OutputArtifacts
	}
	return nil
}

// Information about one or more artifacts.  This should match the rest of
// the ArtifactInfo definitions in ArtifactsByService, other than having
// it's own (service-specific) definition for ArtifactType.
type ArtifactsByService_Sysroot_ArtifactInfo struct {
	// The ArtifactType.  One or more types to which the rest of the fields
	// apply.
	ArtifactTypes []ArtifactsByService_Sysroot_ArtifactType `protobuf:"varint,1,rep,packed,name=artifact_types,json=artifactTypes,proto3,enum=chromiumos.ArtifactsByService_Sysroot_ArtifactType" json:"artifact_types,omitempty"`
	// GS location in which to upload 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.
	//
	// BuilderConfig.Artifacts.artifacts_gs_location is used for all
	// artifacts.  Artifact can be published to additional locations by
	// specifying those here.  Examples: include AFDO artifacts and Release
	// images.
	GsLocations []string `protobuf:"bytes,2,rep,name=gs_locations,json=gsLocations,proto3" json:"gs_locations,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 *ArtifactsByService_Sysroot_ArtifactInfo) Reset() {
	*m = ArtifactsByService_Sysroot_ArtifactInfo{}
}
func (m *ArtifactsByService_Sysroot_ArtifactInfo) String() string { return proto.CompactTextString(m) }
func (*ArtifactsByService_Sysroot_ArtifactInfo) ProtoMessage()    {}
func (*ArtifactsByService_Sysroot_ArtifactInfo) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{18, 4, 0}
}

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

var xxx_messageInfo_ArtifactsByService_Sysroot_ArtifactInfo proto.InternalMessageInfo

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

func (m *ArtifactsByService_Sysroot_ArtifactInfo) GetGsLocations() []string {
	if m != nil {
		return m.GsLocations
	}
	return nil
}

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

type ArtifactsByService_Test struct {
	// Input artifact information
	InputArtifacts []*ArtifactsByService_Test_ArtifactInfo `protobuf:"bytes,1,rep,name=input_artifacts,json=inputArtifacts,proto3" json:"input_artifacts,omitempty"`
	// Output artifact information
	OutputArtifacts      []*ArtifactsByService_Test_ArtifactInfo `protobuf:"bytes,2,rep,name=output_artifacts,json=outputArtifacts,proto3" json:"output_artifacts,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                `json:"-"`
	XXX_unrecognized     []byte                                  `json:"-"`
	XXX_sizecache        int32                                   `json:"-"`
}

func (m *ArtifactsByService_Test) Reset()         { *m = ArtifactsByService_Test{} }
func (m *ArtifactsByService_Test) String() string { return proto.CompactTextString(m) }
func (*ArtifactsByService_Test) ProtoMessage()    {}
func (*ArtifactsByService_Test) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{18, 5}
}

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

var xxx_messageInfo_ArtifactsByService_Test proto.InternalMessageInfo

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

func (m *ArtifactsByService_Test) GetOutputArtifacts() []*ArtifactsByService_Test_ArtifactInfo {
	if m != nil {
		return m.OutputArtifacts
	}
	return nil
}

// Information about one or more artifacts.  This should match the rest of
// the ArtifactInfo definitions in ArtifactsByService, other than having
// it's own (service-specific) definition for ArtifactType.
type ArtifactsByService_Test_ArtifactInfo struct {
	// The ArtifactType.  One or more types to which the rest of the fields
	// apply.
	ArtifactTypes []ArtifactsByService_Test_ArtifactType `protobuf:"varint,1,rep,packed,name=artifact_types,json=artifactTypes,proto3,enum=chromiumos.ArtifactsByService_Test_ArtifactType" json:"artifact_types,omitempty"`
	// GS location in which to upload 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.
	//
	// BuilderConfig.Artifacts.artifacts_gs_location is used for all
	// artifacts.  Artifact can be published to additional locations by
	// specifying those here.  Examples: include AFDO artifacts and Release
	// images.
	GsLocations []string `protobuf:"bytes,2,rep,name=gs_locations,json=gsLocations,proto3" json:"gs_locations,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 *ArtifactsByService_Test_ArtifactInfo) Reset()         { *m = ArtifactsByService_Test_ArtifactInfo{} }
func (m *ArtifactsByService_Test_ArtifactInfo) String() string { return proto.CompactTextString(m) }
func (*ArtifactsByService_Test_ArtifactInfo) ProtoMessage()    {}
func (*ArtifactsByService_Test_ArtifactInfo) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{18, 5, 0}
}

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

var xxx_messageInfo_ArtifactsByService_Test_ArtifactInfo proto.InternalMessageInfo

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

func (m *ArtifactsByService_Test_ArtifactInfo) GetGsLocations() []string {
	if m != nil {
		return m.GsLocations
	}
	return nil
}

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

// Artifact information. Used bythe  ArtifactsService.PrepareForBuild and
// BundleArtifacts endpoints Response messages.
type UploadedArtifactsByService struct {
	Legacy               *UploadedArtifactsByService_Legacy    `protobuf:"bytes,1,opt,name=legacy,proto3" json:"legacy,omitempty"`
	Toolchain            *UploadedArtifactsByService_Toolchain `protobuf:"bytes,2,opt,name=toolchain,proto3" json:"toolchain,omitempty"`
	Image                *UploadedArtifactsByService_Image     `protobuf:"bytes,3,opt,name=image,proto3" json:"image,omitempty"`
	Package              *UploadedArtifactsByService_Package   `protobuf:"bytes,4,opt,name=package,proto3" json:"package,omitempty"`
	Sysroot              *UploadedArtifactsByService_Sysroot   `protobuf:"bytes,5,opt,name=sysroot,proto3" json:"sysroot,omitempty"`
	Test                 *UploadedArtifactsByService_Test      `protobuf:"bytes,6,opt,name=test,proto3" json:"test,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                              `json:"-"`
	XXX_unrecognized     []byte                                `json:"-"`
	XXX_sizecache        int32                                 `json:"-"`
}

func (m *UploadedArtifactsByService) Reset()         { *m = UploadedArtifactsByService{} }
func (m *UploadedArtifactsByService) String() string { return proto.CompactTextString(m) }
func (*UploadedArtifactsByService) ProtoMessage()    {}
func (*UploadedArtifactsByService) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{19}
}

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

var xxx_messageInfo_UploadedArtifactsByService proto.InternalMessageInfo

func (m *UploadedArtifactsByService) GetLegacy() *UploadedArtifactsByService_Legacy {
	if m != nil {
		return m.Legacy
	}
	return nil
}

func (m *UploadedArtifactsByService) GetToolchain() *UploadedArtifactsByService_Toolchain {
	if m != nil {
		return m.Toolchain
	}
	return nil
}

func (m *UploadedArtifactsByService) GetImage() *UploadedArtifactsByService_Image {
	if m != nil {
		return m.Image
	}
	return nil
}

func (m *UploadedArtifactsByService) GetPackage() *UploadedArtifactsByService_Package {
	if m != nil {
		return m.Package
	}
	return nil
}

func (m *UploadedArtifactsByService) GetSysroot() *UploadedArtifactsByService_Sysroot {
	if m != nil {
		return m.Sysroot
	}
	return nil
}

func (m *UploadedArtifactsByService) GetTest() *UploadedArtifactsByService_Test {
	if m != nil {
		return m.Test
	}
	return nil
}

// Legacy artifacts, handled directly ArtifactsService.
// Artifacts handled within the ArtifactsService endpoints directly.
// TODO(crbug/1034529): Drop this message.
type UploadedArtifactsByService_Legacy struct {
	Artifacts            []*UploadedArtifactsByService_Legacy_ArtifactPaths `protobuf:"bytes,1,rep,name=artifacts,proto3" json:"artifacts,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                           `json:"-"`
	XXX_unrecognized     []byte                                             `json:"-"`
	XXX_sizecache        int32                                              `json:"-"`
}

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

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

var xxx_messageInfo_UploadedArtifactsByService_Legacy proto.InternalMessageInfo

func (m *UploadedArtifactsByService_Legacy) GetArtifacts() []*UploadedArtifactsByService_Legacy_ArtifactPaths {
	if m != nil {
		return m.Artifacts
	}
	return nil
}

type UploadedArtifactsByService_Legacy_ArtifactPaths struct {
	// The ArtifactType.
	ArtifactType ArtifactsByService_Legacy_ArtifactType `protobuf:"varint,1,opt,name=artifact_type,json=artifactType,proto3,enum=chromiumos.ArtifactsByService_Legacy_ArtifactType" json:"artifact_type,omitempty"`
	// Absolute path to the artifact file.
	Paths                []string `protobuf:"bytes,2,rep,name=paths,proto3" json:"paths,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_UploadedArtifactsByService_Legacy_ArtifactPaths proto.InternalMessageInfo

func (m *UploadedArtifactsByService_Legacy_ArtifactPaths) GetArtifactType() ArtifactsByService_Legacy_ArtifactType {
	if m != nil {
		return m.ArtifactType
	}
	return ArtifactsByService_Legacy_UNSPECIFIED
}

func (m *UploadedArtifactsByService_Legacy_ArtifactPaths) GetPaths() []string {
	if m != nil {
		return m.Paths
	}
	return nil
}

type UploadedArtifactsByService_Toolchain struct {
	Artifacts            []*UploadedArtifactsByService_Toolchain_ArtifactPaths `protobuf:"bytes,1,rep,name=artifacts,proto3" json:"artifacts,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                              `json:"-"`
	XXX_unrecognized     []byte                                                `json:"-"`
	XXX_sizecache        int32                                                 `json:"-"`
}

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

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

var xxx_messageInfo_UploadedArtifactsByService_Toolchain proto.InternalMessageInfo

func (m *UploadedArtifactsByService_Toolchain) GetArtifacts() []*UploadedArtifactsByService_Toolchain_ArtifactPaths {
	if m != nil {
		return m.Artifacts
	}
	return nil
}

type UploadedArtifactsByService_Toolchain_ArtifactPaths struct {
	// The ArtifactType.
	ArtifactType ArtifactsByService_Toolchain_ArtifactType `protobuf:"varint,1,opt,name=artifact_type,json=artifactType,proto3,enum=chromiumos.ArtifactsByService_Toolchain_ArtifactType" json:"artifact_type,omitempty"`
	// Absolute path to the artifact file.
	Paths                []string `protobuf:"bytes,2,rep,name=paths,proto3" json:"paths,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_UploadedArtifactsByService_Toolchain_ArtifactPaths proto.InternalMessageInfo

func (m *UploadedArtifactsByService_Toolchain_ArtifactPaths) GetArtifactType() ArtifactsByService_Toolchain_ArtifactType {
	if m != nil {
		return m.ArtifactType
	}
	return ArtifactsByService_Toolchain_UNSPECIFIED
}

func (m *UploadedArtifactsByService_Toolchain_ArtifactPaths) GetPaths() []string {
	if m != nil {
		return m.Paths
	}
	return nil
}

type UploadedArtifactsByService_Image struct {
	Artifacts            []*UploadedArtifactsByService_Image_ArtifactPaths `protobuf:"bytes,1,rep,name=artifacts,proto3" json:"artifacts,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                          `json:"-"`
	XXX_unrecognized     []byte                                            `json:"-"`
	XXX_sizecache        int32                                             `json:"-"`
}

func (m *UploadedArtifactsByService_Image) Reset()         { *m = UploadedArtifactsByService_Image{} }
func (m *UploadedArtifactsByService_Image) String() string { return proto.CompactTextString(m) }
func (*UploadedArtifactsByService_Image) ProtoMessage()    {}
func (*UploadedArtifactsByService_Image) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{19, 2}
}

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

var xxx_messageInfo_UploadedArtifactsByService_Image proto.InternalMessageInfo

func (m *UploadedArtifactsByService_Image) GetArtifacts() []*UploadedArtifactsByService_Image_ArtifactPaths {
	if m != nil {
		return m.Artifacts
	}
	return nil
}

type UploadedArtifactsByService_Image_ArtifactPaths struct {
	// The ArtifactType.
	ArtifactType ArtifactsByService_Image_ArtifactType `protobuf:"varint,1,opt,name=artifact_type,json=artifactType,proto3,enum=chromiumos.ArtifactsByService_Image_ArtifactType" json:"artifact_type,omitempty"`
	// Absolute path to the artifact file.
	Paths                []string `protobuf:"bytes,2,rep,name=paths,proto3" json:"paths,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_UploadedArtifactsByService_Image_ArtifactPaths proto.InternalMessageInfo

func (m *UploadedArtifactsByService_Image_ArtifactPaths) GetArtifactType() ArtifactsByService_Image_ArtifactType {
	if m != nil {
		return m.ArtifactType
	}
	return ArtifactsByService_Image_UNSPECIFIED
}

func (m *UploadedArtifactsByService_Image_ArtifactPaths) GetPaths() []string {
	if m != nil {
		return m.Paths
	}
	return nil
}

type UploadedArtifactsByService_Package struct {
	Artifacts            []*UploadedArtifactsByService_Package_ArtifactPaths `protobuf:"bytes,1,rep,name=artifacts,proto3" json:"artifacts,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                            `json:"-"`
	XXX_unrecognized     []byte                                              `json:"-"`
	XXX_sizecache        int32                                               `json:"-"`
}

func (m *UploadedArtifactsByService_Package) Reset()         { *m = UploadedArtifactsByService_Package{} }
func (m *UploadedArtifactsByService_Package) String() string { return proto.CompactTextString(m) }
func (*UploadedArtifactsByService_Package) ProtoMessage()    {}
func (*UploadedArtifactsByService_Package) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{19, 3}
}

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

var xxx_messageInfo_UploadedArtifactsByService_Package proto.InternalMessageInfo

func (m *UploadedArtifactsByService_Package) GetArtifacts() []*UploadedArtifactsByService_Package_ArtifactPaths {
	if m != nil {
		return m.Artifacts
	}
	return nil
}

type UploadedArtifactsByService_Package_ArtifactPaths struct {
	// The ArtifactType.
	ArtifactType ArtifactsByService_Package_ArtifactType `protobuf:"varint,1,opt,name=artifact_type,json=artifactType,proto3,enum=chromiumos.ArtifactsByService_Package_ArtifactType" json:"artifact_type,omitempty"`
	// Absolute path to the artifact file.
	Paths                []string `protobuf:"bytes,2,rep,name=paths,proto3" json:"paths,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_UploadedArtifactsByService_Package_ArtifactPaths proto.InternalMessageInfo

func (m *UploadedArtifactsByService_Package_ArtifactPaths) GetArtifactType() ArtifactsByService_Package_ArtifactType {
	if m != nil {
		return m.ArtifactType
	}
	return ArtifactsByService_Package_UNSPECIFIED
}

func (m *UploadedArtifactsByService_Package_ArtifactPaths) GetPaths() []string {
	if m != nil {
		return m.Paths
	}
	return nil
}

type UploadedArtifactsByService_Sysroot struct {
	Artifacts            []*UploadedArtifactsByService_Sysroot_ArtifactPaths `protobuf:"bytes,1,rep,name=artifacts,proto3" json:"artifacts,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                            `json:"-"`
	XXX_unrecognized     []byte                                              `json:"-"`
	XXX_sizecache        int32                                               `json:"-"`
}

func (m *UploadedArtifactsByService_Sysroot) Reset()         { *m = UploadedArtifactsByService_Sysroot{} }
func (m *UploadedArtifactsByService_Sysroot) String() string { return proto.CompactTextString(m) }
func (*UploadedArtifactsByService_Sysroot) ProtoMessage()    {}
func (*UploadedArtifactsByService_Sysroot) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{19, 4}
}

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

var xxx_messageInfo_UploadedArtifactsByService_Sysroot proto.InternalMessageInfo

func (m *UploadedArtifactsByService_Sysroot) GetArtifacts() []*UploadedArtifactsByService_Sysroot_ArtifactPaths {
	if m != nil {
		return m.Artifacts
	}
	return nil
}

type UploadedArtifactsByService_Sysroot_ArtifactPaths struct {
	// The ArtifactType.
	ArtifactType ArtifactsByService_Sysroot_ArtifactType `protobuf:"varint,1,opt,name=artifact_type,json=artifactType,proto3,enum=chromiumos.ArtifactsByService_Sysroot_ArtifactType" json:"artifact_type,omitempty"`
	// Absolute path to the artifact file.
	Paths                []string `protobuf:"bytes,2,rep,name=paths,proto3" json:"paths,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_UploadedArtifactsByService_Sysroot_ArtifactPaths proto.InternalMessageInfo

func (m *UploadedArtifactsByService_Sysroot_ArtifactPaths) GetArtifactType() ArtifactsByService_Sysroot_ArtifactType {
	if m != nil {
		return m.ArtifactType
	}
	return ArtifactsByService_Sysroot_UNSPECIFIED
}

func (m *UploadedArtifactsByService_Sysroot_ArtifactPaths) GetPaths() []string {
	if m != nil {
		return m.Paths
	}
	return nil
}

type UploadedArtifactsByService_Test struct {
	Artifacts            []*UploadedArtifactsByService_Test_ArtifactPaths `protobuf:"bytes,1,rep,name=artifacts,proto3" json:"artifacts,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                         `json:"-"`
	XXX_unrecognized     []byte                                           `json:"-"`
	XXX_sizecache        int32                                            `json:"-"`
}

func (m *UploadedArtifactsByService_Test) Reset()         { *m = UploadedArtifactsByService_Test{} }
func (m *UploadedArtifactsByService_Test) String() string { return proto.CompactTextString(m) }
func (*UploadedArtifactsByService_Test) ProtoMessage()    {}
func (*UploadedArtifactsByService_Test) Descriptor() ([]byte, []int) {
	return fileDescriptor_fa0b57c3d7d4c63b, []int{19, 5}
}

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

var xxx_messageInfo_UploadedArtifactsByService_Test proto.InternalMessageInfo

func (m *UploadedArtifactsByService_Test) GetArtifacts() []*UploadedArtifactsByService_Test_ArtifactPaths {
	if m != nil {
		return m.Artifacts
	}
	return nil
}

type UploadedArtifactsByService_Test_ArtifactPaths struct {
	// The ArtifactType.
	ArtifactType ArtifactsByService_Test_ArtifactType `protobuf:"varint,1,opt,name=artifact_type,json=artifactType,proto3,enum=chromiumos.ArtifactsByService_Test_ArtifactType" json:"artifact_type,omitempty"`
	// Absolute path to the artifact file.
	Paths                []string `protobuf:"bytes,2,rep,name=paths,proto3" json:"paths,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_UploadedArtifactsByService_Test_ArtifactPaths proto.InternalMessageInfo

func (m *UploadedArtifactsByService_Test_ArtifactPaths) GetArtifactType() ArtifactsByService_Test_ArtifactType {
	if m != nil {
		return m.ArtifactType
	}
	return ArtifactsByService_Test_UNSPECIFIED
}

func (m *UploadedArtifactsByService_Test_ArtifactPaths) GetPaths() []string {
	if m != nil {
		return m.Paths
	}
	return nil
}

func init() {
	proto.RegisterEnum("chromiumos.ImageType", ImageType_name, ImageType_value)
	proto.RegisterEnum("chromiumos.Channel", Channel_name, Channel_value)
	proto.RegisterEnum("chromiumos.DeltaType", DeltaType_name, DeltaType_value)
	proto.RegisterEnum("chromiumos.AFDOArtifactType", AFDOArtifactType_name, AFDOArtifactType_value)
	proto.RegisterEnum("chromiumos.GomaConfig_GomaApproach", GomaConfig_GomaApproach_name, GomaConfig_GomaApproach_value)
	proto.RegisterEnum("chromiumos.Path_Location", Path_Location_name, Path_Location_value)
	proto.RegisterEnum("chromiumos.ArtifactsByService_Legacy_ArtifactType", ArtifactsByService_Legacy_ArtifactType_name, ArtifactsByService_Legacy_ArtifactType_value)
	proto.RegisterEnum("chromiumos.ArtifactsByService_Toolchain_ArtifactType", ArtifactsByService_Toolchain_ArtifactType_name, ArtifactsByService_Toolchain_ArtifactType_value)
	proto.RegisterEnum("chromiumos.ArtifactsByService_Image_ArtifactType", ArtifactsByService_Image_ArtifactType_name, ArtifactsByService_Image_ArtifactType_value)
	proto.RegisterEnum("chromiumos.ArtifactsByService_Package_ArtifactType", ArtifactsByService_Package_ArtifactType_name, ArtifactsByService_Package_ArtifactType_value)
	proto.RegisterEnum("chromiumos.ArtifactsByService_Sysroot_ArtifactType", ArtifactsByService_Sysroot_ArtifactType_name, ArtifactsByService_Sysroot_ArtifactType_value)
	proto.RegisterEnum("chromiumos.ArtifactsByService_Test_ArtifactType", ArtifactsByService_Test_ArtifactType_name, ArtifactsByService_Test_ArtifactType_value)
	proto.RegisterType((*BuildTarget)(nil), "chromiumos.BuildTarget")
	proto.RegisterType((*Chroot)(nil), "chromiumos.Chroot")
	proto.RegisterType((*Chroot_ChrootEnv)(nil), "chromiumos.Chroot.ChrootEnv")
	proto.RegisterType((*Feature)(nil), "chromiumos.Feature")
	proto.RegisterType((*GomaConfig)(nil), "chromiumos.GomaConfig")
	proto.RegisterType((*GomaArtifacts)(nil), "chromiumos.GomaArtifacts")
	proto.RegisterType((*PackageInfo)(nil), "chromiumos.PackageInfo")
	proto.RegisterType((*Profile)(nil), "chromiumos.Profile")
	proto.RegisterType((*PackageIndexInfo)(nil), "chromiumos.PackageIndexInfo")
	proto.RegisterType((*Path)(nil), "chromiumos.Path")
	proto.RegisterType((*ResultPath)(nil), "chromiumos.ResultPath")
	proto.RegisterType((*SyncedDir)(nil), "chromiumos.SyncedDir")
	proto.RegisterType((*GerritChange)(nil), "chromiumos.GerritChange")
	proto.RegisterType((*GitilesCommit)(nil), "chromiumos.GitilesCommit")
	proto.RegisterType((*UseFlag)(nil), "chromiumos.UseFlag")
	proto.RegisterType((*ProtoBytes)(nil), "chromiumos.ProtoBytes")
	proto.RegisterType((*PrepareForBuildAdditionalArgs)(nil), "chromiumos.PrepareForBuildAdditionalArgs")
	proto.RegisterType((*AfdoRelease)(nil), "chromiumos.AfdoRelease")
	proto.RegisterType((*ArtifactProfileInfo)(nil), "chromiumos.ArtifactProfileInfo")
	proto.RegisterType((*ArtifactsByService)(nil), "chromiumos.ArtifactsByService")
	proto.RegisterType((*ArtifactsByService_Legacy)(nil), "chromiumos.ArtifactsByService.Legacy")
	proto.RegisterType((*ArtifactsByService_Legacy_ArtifactInfo)(nil), "chromiumos.ArtifactsByService.Legacy.ArtifactInfo")
	proto.RegisterType((*ArtifactsByService_Toolchain)(nil), "chromiumos.ArtifactsByService.Toolchain")
	proto.RegisterType((*ArtifactsByService_Toolchain_ArtifactInfo)(nil), "chromiumos.ArtifactsByService.Toolchain.ArtifactInfo")
	proto.RegisterType((*ArtifactsByService_Image)(nil), "chromiumos.ArtifactsByService.Image")
	proto.RegisterType((*ArtifactsByService_Image_ArtifactInfo)(nil), "chromiumos.ArtifactsByService.Image.ArtifactInfo")
	proto.RegisterType((*ArtifactsByService_Package)(nil), "chromiumos.ArtifactsByService.Package")
	proto.RegisterType((*ArtifactsByService_Package_ArtifactInfo)(nil), "chromiumos.ArtifactsByService.Package.ArtifactInfo")
	proto.RegisterType((*ArtifactsByService_Sysroot)(nil), "chromiumos.ArtifactsByService.Sysroot")
	proto.RegisterType((*ArtifactsByService_Sysroot_ArtifactInfo)(nil), "chromiumos.ArtifactsByService.Sysroot.ArtifactInfo")
	proto.RegisterType((*ArtifactsByService_Test)(nil), "chromiumos.ArtifactsByService.Test")
	proto.RegisterType((*ArtifactsByService_Test_ArtifactInfo)(nil), "chromiumos.ArtifactsByService.Test.ArtifactInfo")
	proto.RegisterType((*UploadedArtifactsByService)(nil), "chromiumos.UploadedArtifactsByService")
	proto.RegisterType((*UploadedArtifactsByService_Legacy)(nil), "chromiumos.UploadedArtifactsByService.Legacy")
	proto.RegisterType((*UploadedArtifactsByService_Legacy_ArtifactPaths)(nil), "chromiumos.UploadedArtifactsByService.Legacy.ArtifactPaths")
	proto.RegisterType((*UploadedArtifactsByService_Toolchain)(nil), "chromiumos.UploadedArtifactsByService.Toolchain")
	proto.RegisterType((*UploadedArtifactsByService_Toolchain_ArtifactPaths)(nil), "chromiumos.UploadedArtifactsByService.Toolchain.ArtifactPaths")
	proto.RegisterType((*UploadedArtifactsByService_Image)(nil), "chromiumos.UploadedArtifactsByService.Image")
	proto.RegisterType((*UploadedArtifactsByService_Image_ArtifactPaths)(nil), "chromiumos.UploadedArtifactsByService.Image.ArtifactPaths")
	proto.RegisterType((*UploadedArtifactsByService_Package)(nil), "chromiumos.UploadedArtifactsByService.Package")
	proto.RegisterType((*UploadedArtifactsByService_Package_ArtifactPaths)(nil), "chromiumos.UploadedArtifactsByService.Package.ArtifactPaths")
	proto.RegisterType((*UploadedArtifactsByService_Sysroot)(nil), "chromiumos.UploadedArtifactsByService.Sysroot")
	proto.RegisterType((*UploadedArtifactsByService_Sysroot_ArtifactPaths)(nil), "chromiumos.UploadedArtifactsByService.Sysroot.ArtifactPaths")
	proto.RegisterType((*UploadedArtifactsByService_Test)(nil), "chromiumos.UploadedArtifactsByService.Test")
	proto.RegisterType((*UploadedArtifactsByService_Test_ArtifactPaths)(nil), "chromiumos.UploadedArtifactsByService.Test.ArtifactPaths")
}

func init() { proto.RegisterFile("chromiumos/common.proto", fileDescriptor_fa0b57c3d7d4c63b) }

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