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

package api

import (
	context "context"
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	chromiumos "go.chromium.org/chromiumos/infra/proto/go/chromiumos"
	grpc "google.golang.org/grpc"
	codes "google.golang.org/grpc/codes"
	status "google.golang.org/grpc/status"
	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

// TODO(crbug.com/1020615): Drop this once this is live in production and all of
// the users have migrated to using BuilderConfig.Artifacts.ArtifactType
// Meanwhile, keep this in sync with chromiumos/builder_config.proto.
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_7ff43bdb7436d394, []int{0}
}

// Information about a collection of artifacts.
type ArtifactInfo struct {
	// The ArtifactType.
	ArtifactType chromiumos.BuilderConfig_Artifacts_ArtifactTypes `protobuf:"varint,1,opt,name=artifact_type,json=artifactType,proto3,enum=chromiumos.BuilderConfig_Artifacts_ArtifactTypes" json:"artifact_type,omitempty"`
	// Artifacts for this ArtifactType.
	Artifacts            []*Artifact `protobuf:"bytes,2,rep,name=artifacts,proto3" json:"artifacts,omitempty"`
	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
	XXX_unrecognized     []byte      `json:"-"`
	XXX_sizecache        int32       `json:"-"`
}

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

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

var xxx_messageInfo_ArtifactInfo proto.InternalMessageInfo

func (m *ArtifactInfo) GetArtifactType() chromiumos.BuilderConfig_Artifacts_ArtifactTypes {
	if m != nil {
		return m.ArtifactType
	}
	return chromiumos.BuilderConfig_Artifacts_ARTIFACT_TYPES_UNSPECIFIED
}

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

// Prepare the build for artifact building.
type PrepareForToolchainBuildRequest struct {
	// The artifact types that this build should make.
	ArtifactTypes []chromiumos.BuilderConfig_Artifacts_ArtifactTypes `protobuf:"varint,1,rep,packed,name=artifact_types,json=artifactTypes,proto3,enum=chromiumos.BuilderConfig_Artifacts_ArtifactTypes" json:"artifact_types,omitempty"`
	// Note: both chroot and sysroot may be unspecified, when the endpoint is
	// called prior to their creation.
	// The chroot where the sysroot lives.
	Chroot *chromiumos.Chroot `protobuf:"bytes,2,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// The sysroot where the files live.
	Sysroot *Sysroot `protobuf:"bytes,3,opt,name=sysroot,proto3" json:"sysroot,omitempty"`
	// Information about artifacts available when preparing.
	InputArtifacts []*chromiumos.BuilderConfig_Artifacts_InputArtifactInfo `protobuf:"bytes,4,rep,name=input_artifacts,json=inputArtifacts,proto3" json:"input_artifacts,omitempty"`
	// Additional arguments used in PrepareForBuild.
	// TODO(crbug/1019868): Transition to artifact_profile_info.
	AdditionalArgs *chromiumos.PrepareForBuildAdditionalArgs `protobuf:"bytes,5,opt,name=additional_args,json=additionalArgs,proto3" json:"additional_args,omitempty"`
	// Profile information used for the artifact.
	ProfileInfo          *chromiumos.ArtifactProfileInfo `protobuf:"bytes,6,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 *PrepareForToolchainBuildRequest) Reset()         { *m = PrepareForToolchainBuildRequest{} }
func (m *PrepareForToolchainBuildRequest) String() string { return proto.CompactTextString(m) }
func (*PrepareForToolchainBuildRequest) ProtoMessage()    {}
func (*PrepareForToolchainBuildRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_7ff43bdb7436d394, []int{1}
}

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

var xxx_messageInfo_PrepareForToolchainBuildRequest proto.InternalMessageInfo

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

func (m *PrepareForToolchainBuildRequest) GetChroot() *chromiumos.Chroot {
	if m != nil {
		return m.Chroot
	}
	return nil
}

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

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

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

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

type PrepareForToolchainBuildResponse struct {
	// Does this artifact require a build?  See artifacts.proto in this directory.
	BuildRelevance       PrepareForBuildResponse_BuildRelevance `protobuf:"varint,1,opt,name=build_relevance,json=buildRelevance,proto3,enum=chromite.api.PrepareForBuildResponse_BuildRelevance" json:"build_relevance,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                               `json:"-"`
	XXX_unrecognized     []byte                                 `json:"-"`
	XXX_sizecache        int32                                  `json:"-"`
}

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

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

var xxx_messageInfo_PrepareForToolchainBuildResponse proto.InternalMessageInfo

func (m *PrepareForToolchainBuildResponse) GetBuildRelevance() PrepareForBuildResponse_BuildRelevance {
	if m != nil {
		return m.BuildRelevance
	}
	return PrepareForBuildResponse_UNSPECIFIED
}

type BundleToolchainRequest struct {
	// The chroot where the sysroot lives.
	Chroot *chromiumos.Chroot `protobuf:"bytes,1,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// The sysroot where the files live.
	Sysroot *Sysroot `protobuf:"bytes,2,opt,name=sysroot,proto3" json:"sysroot,omitempty"`
	// Absolute path to the directory in which artifacts should be dropped.
	OutputDir string `protobuf:"bytes,3,opt,name=output_dir,json=outputDir,proto3" json:"output_dir,omitempty"`
	// Which artifacts are wanted?
	ArtifactTypes []chromiumos.BuilderConfig_Artifacts_ArtifactTypes `protobuf:"varint,4,rep,packed,name=artifact_types,json=artifactTypes,proto3,enum=chromiumos.BuilderConfig_Artifacts_ArtifactTypes" json:"artifact_types,omitempty"`
	// Additional arguments that were used in PrepareForBuild.
	// TODO(crbug/1019868): Transition to artifact_profile_info.
	AdditionalArgs *chromiumos.PrepareForBuildAdditionalArgs `protobuf:"bytes,5,opt,name=additional_args,json=additionalArgs,proto3" json:"additional_args,omitempty"`
	// Profile information used for the artifact.
	ProfileInfo          *chromiumos.ArtifactProfileInfo `protobuf:"bytes,6,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 *BundleToolchainRequest) Reset()         { *m = BundleToolchainRequest{} }
func (m *BundleToolchainRequest) String() string { return proto.CompactTextString(m) }
func (*BundleToolchainRequest) ProtoMessage()    {}
func (*BundleToolchainRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_7ff43bdb7436d394, []int{3}
}

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

var xxx_messageInfo_BundleToolchainRequest proto.InternalMessageInfo

func (m *BundleToolchainRequest) GetChroot() *chromiumos.Chroot {
	if m != nil {
		return m.Chroot
	}
	return nil
}

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

func (m *BundleToolchainRequest) GetOutputDir() string {
	if m != nil {
		return m.OutputDir
	}
	return ""
}

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

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

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

// Response describing which bundles were dumped to the given output directory.
type BundleToolchainResponse struct {
	// The artifacts that added to the output directory.
	ArtifactsInfo        []*ArtifactInfo `protobuf:"bytes,2,rep,name=artifacts_info,json=artifactsInfo,proto3" json:"artifacts_info,omitempty"`
	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
	XXX_unrecognized     []byte          `json:"-"`
	XXX_sizecache        int32           `json:"-"`
}

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

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

var xxx_messageInfo_BundleToolchainResponse proto.InternalMessageInfo

func (m *BundleToolchainResponse) GetArtifactsInfo() []*ArtifactInfo {
	if m != nil {
		return m.ArtifactsInfo
	}
	return nil
}

type GetUpdatedFilesRequest struct {
	UploadedArtifacts    []*GetUpdatedFilesRequest_UploadedArtifacts `protobuf:"bytes,1,rep,name=uploaded_artifacts,json=uploadedArtifacts,proto3" json:"uploaded_artifacts,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                    `json:"-"`
	XXX_unrecognized     []byte                                      `json:"-"`
	XXX_sizecache        int32                                       `json:"-"`
}

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

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

var xxx_messageInfo_GetUpdatedFilesRequest proto.InternalMessageInfo

func (m *GetUpdatedFilesRequest) GetUploadedArtifacts() []*GetUpdatedFilesRequest_UploadedArtifacts {
	if m != nil {
		return m.UploadedArtifacts
	}
	return nil
}

// We need the artifact info from BundleResponse and the profile info
// as the input of the request.
type GetUpdatedFilesRequest_UploadedArtifacts struct {
	ArtifactInfo         *ArtifactInfo                   `protobuf:"bytes,1,opt,name=artifact_info,json=artifactInfo,proto3" json:"artifact_info,omitempty"`
	ProfileInfo          *chromiumos.ArtifactProfileInfo `protobuf:"bytes,2,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 *GetUpdatedFilesRequest_UploadedArtifacts) Reset() {
	*m = GetUpdatedFilesRequest_UploadedArtifacts{}
}
func (m *GetUpdatedFilesRequest_UploadedArtifacts) String() string { return proto.CompactTextString(m) }
func (*GetUpdatedFilesRequest_UploadedArtifacts) ProtoMessage()    {}
func (*GetUpdatedFilesRequest_UploadedArtifacts) Descriptor() ([]byte, []int) {
	return fileDescriptor_7ff43bdb7436d394, []int{5, 0}
}

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

var xxx_messageInfo_GetUpdatedFilesRequest_UploadedArtifacts proto.InternalMessageInfo

func (m *GetUpdatedFilesRequest_UploadedArtifacts) GetArtifactInfo() *ArtifactInfo {
	if m != nil {
		return m.ArtifactInfo
	}
	return nil
}

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

type GetUpdatedFilesResponse struct {
	UpdatedFiles []*GetUpdatedFilesResponse_UpdatedFile `protobuf:"bytes,1,rep,name=updated_files,json=updatedFiles,proto3" json:"updated_files,omitempty"`
	// The commit message to use.
	CommitMessage string `protobuf:"bytes,2,opt,name=commit_message,json=commitMessage,proto3" json:"commit_message,omitempty"`
	// Any footers to use.  Formatted to the current standard by Recipes.
	CommitFooter         []*GetUpdatedFilesResponse_CommitFooter `protobuf:"bytes,3,rep,name=commit_footer,json=commitFooter,proto3" json:"commit_footer,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                `json:"-"`
	XXX_unrecognized     []byte                                  `json:"-"`
	XXX_sizecache        int32                                   `json:"-"`
}

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

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

var xxx_messageInfo_GetUpdatedFilesResponse proto.InternalMessageInfo

func (m *GetUpdatedFilesResponse) GetUpdatedFiles() []*GetUpdatedFilesResponse_UpdatedFile {
	if m != nil {
		return m.UpdatedFiles
	}
	return nil
}

func (m *GetUpdatedFilesResponse) GetCommitMessage() string {
	if m != nil {
		return m.CommitMessage
	}
	return ""
}

func (m *GetUpdatedFilesResponse) GetCommitFooter() []*GetUpdatedFilesResponse_CommitFooter {
	if m != nil {
		return m.CommitFooter
	}
	return nil
}

type GetUpdatedFilesResponse_UpdatedFile struct {
	// The path to the (uncommitted) file.
	Path                 string   `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_GetUpdatedFilesResponse_UpdatedFile proto.InternalMessageInfo

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

// The Cq-Depend footer is used by LUCI (and Chrome OS Recipes) to operate
// on interdependent changes at various steps.
type GetUpdatedFilesResponse_CqDependFooter struct {
	// The gerrit change(s) we depend on.
	GerritChange         []*chromiumos.GerritChange `protobuf:"bytes,1,rep,name=gerrit_change,json=gerritChange,proto3" json:"gerrit_change,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                   `json:"-"`
	XXX_unrecognized     []byte                     `json:"-"`
	XXX_sizecache        int32                      `json:"-"`
}

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

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

var xxx_messageInfo_GetUpdatedFilesResponse_CqDependFooter proto.InternalMessageInfo

func (m *GetUpdatedFilesResponse_CqDependFooter) GetGerritChange() []*chromiumos.GerritChange {
	if m != nil {
		return m.GerritChange
	}
	return nil
}

// The Cq-Cl-Tag footer is used by cq-orchestrator to choose quota pools.
type GetUpdatedFilesResponse_CqClTagFooter struct {
	// The Cq-Cl-Tag value.
	Tag                  string   `protobuf:"bytes,1,opt,name=tag,proto3" json:"tag,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_GetUpdatedFilesResponse_CqClTagFooter proto.InternalMessageInfo

func (m *GetUpdatedFilesResponse_CqClTagFooter) GetTag() string {
	if m != nil {
		return m.Tag
	}
	return ""
}

type GetUpdatedFilesResponse_CommitFooter struct {
	// Types that are valid to be assigned to Footer:
	//	*GetUpdatedFilesResponse_CommitFooter_CqDepend
	//	*GetUpdatedFilesResponse_CommitFooter_CqClTag
	Footer               isGetUpdatedFilesResponse_CommitFooter_Footer `protobuf_oneof:"footer"`
	XXX_NoUnkeyedLiteral struct{}                                      `json:"-"`
	XXX_unrecognized     []byte                                        `json:"-"`
	XXX_sizecache        int32                                         `json:"-"`
}

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

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

var xxx_messageInfo_GetUpdatedFilesResponse_CommitFooter proto.InternalMessageInfo

type isGetUpdatedFilesResponse_CommitFooter_Footer interface {
	isGetUpdatedFilesResponse_CommitFooter_Footer()
}

type GetUpdatedFilesResponse_CommitFooter_CqDepend struct {
	CqDepend *GetUpdatedFilesResponse_CqDependFooter `protobuf:"bytes,1,opt,name=cq_depend,json=cqDepend,proto3,oneof"`
}

type GetUpdatedFilesResponse_CommitFooter_CqClTag struct {
	CqClTag *GetUpdatedFilesResponse_CqClTagFooter `protobuf:"bytes,2,opt,name=cq_cl_tag,json=cqClTag,proto3,oneof"`
}

func (*GetUpdatedFilesResponse_CommitFooter_CqDepend) isGetUpdatedFilesResponse_CommitFooter_Footer() {
}

func (*GetUpdatedFilesResponse_CommitFooter_CqClTag) isGetUpdatedFilesResponse_CommitFooter_Footer() {}

func (m *GetUpdatedFilesResponse_CommitFooter) GetFooter() isGetUpdatedFilesResponse_CommitFooter_Footer {
	if m != nil {
		return m.Footer
	}
	return nil
}

func (m *GetUpdatedFilesResponse_CommitFooter) GetCqDepend() *GetUpdatedFilesResponse_CqDependFooter {
	if x, ok := m.GetFooter().(*GetUpdatedFilesResponse_CommitFooter_CqDepend); ok {
		return x.CqDepend
	}
	return nil
}

func (m *GetUpdatedFilesResponse_CommitFooter) GetCqClTag() *GetUpdatedFilesResponse_CqClTagFooter {
	if x, ok := m.GetFooter().(*GetUpdatedFilesResponse_CommitFooter_CqClTag); ok {
		return x.CqClTag
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*GetUpdatedFilesResponse_CommitFooter) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*GetUpdatedFilesResponse_CommitFooter_CqDepend)(nil),
		(*GetUpdatedFilesResponse_CommitFooter_CqClTag)(nil),
	}
}

type VerifyAFDOArtifactsRequest struct {
	BuildTarget *chromiumos.BuildTarget `protobuf:"bytes,1,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	// The type of AFDO artifact to test.
	ArtifactType         chromiumos.AFDOArtifactType `protobuf:"varint,2,opt,name=artifact_type,json=artifactType,proto3,enum=chromiumos.AFDOArtifactType" json:"artifact_type,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                    `json:"-"`
	XXX_unrecognized     []byte                      `json:"-"`
	XXX_sizecache        int32                       `json:"-"`
}

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

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

var xxx_messageInfo_VerifyAFDOArtifactsRequest proto.InternalMessageInfo

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

func (m *VerifyAFDOArtifactsRequest) GetArtifactType() chromiumos.AFDOArtifactType {
	if m != nil {
		return m.ArtifactType
	}
	return chromiumos.AFDOArtifactType_NONE_TYPE
}

type VerifyAFDOArtifactsResponse struct {
	// Status of the service
	Status               bool     `protobuf:"varint,1,opt,name=status,proto3" json:"status,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_VerifyAFDOArtifactsResponse proto.InternalMessageInfo

func (m *VerifyAFDOArtifactsResponse) GetStatus() bool {
	if m != nil {
		return m.Status
	}
	return false
}

func init() {
	proto.RegisterEnum("chromite.api.AFDOArtifactType", AFDOArtifactType_name, AFDOArtifactType_value)
	proto.RegisterType((*ArtifactInfo)(nil), "chromite.api.ArtifactInfo")
	proto.RegisterType((*PrepareForToolchainBuildRequest)(nil), "chromite.api.PrepareForToolchainBuildRequest")
	proto.RegisterType((*PrepareForToolchainBuildResponse)(nil), "chromite.api.PrepareForToolchainBuildResponse")
	proto.RegisterType((*BundleToolchainRequest)(nil), "chromite.api.BundleToolchainRequest")
	proto.RegisterType((*BundleToolchainResponse)(nil), "chromite.api.BundleToolchainResponse")
	proto.RegisterType((*GetUpdatedFilesRequest)(nil), "chromite.api.GetUpdatedFilesRequest")
	proto.RegisterType((*GetUpdatedFilesRequest_UploadedArtifacts)(nil), "chromite.api.GetUpdatedFilesRequest.UploadedArtifacts")
	proto.RegisterType((*GetUpdatedFilesResponse)(nil), "chromite.api.GetUpdatedFilesResponse")
	proto.RegisterType((*GetUpdatedFilesResponse_UpdatedFile)(nil), "chromite.api.GetUpdatedFilesResponse.UpdatedFile")
	proto.RegisterType((*GetUpdatedFilesResponse_CqDependFooter)(nil), "chromite.api.GetUpdatedFilesResponse.CqDependFooter")
	proto.RegisterType((*GetUpdatedFilesResponse_CqClTagFooter)(nil), "chromite.api.GetUpdatedFilesResponse.CqClTagFooter")
	proto.RegisterType((*GetUpdatedFilesResponse_CommitFooter)(nil), "chromite.api.GetUpdatedFilesResponse.CommitFooter")
	proto.RegisterType((*VerifyAFDOArtifactsRequest)(nil), "chromite.api.VerifyAFDOArtifactsRequest")
	proto.RegisterType((*VerifyAFDOArtifactsResponse)(nil), "chromite.api.VerifyAFDOArtifactsResponse")
}

func init() { proto.RegisterFile("chromite/api/toolchain.proto", fileDescriptor_7ff43bdb7436d394) }

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

// Reference imports to suppress errors if they are not otherwise used.
var _ context.Context
var _ grpc.ClientConn

// This is a compile-time assertion to ensure that this generated file
// is compatible with the grpc package it is being compiled against.
const _ = grpc.SupportPackageIsVersion4

// ToolchainServiceClient is the client API for ToolchainService service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type ToolchainServiceClient interface {
	// DEPRECATED for recipes: used only by legacy toolchain builders.
	// See also crbug/1019868.
	// Update Chrome ebuild with most recent unvetted orderfile
	UpdateEbuildWithAFDOArtifacts(ctx context.Context, in *VerifyAFDOArtifactsRequest, opts ...grpc.CallOption) (*VerifyAFDOArtifactsResponse, error)
	// DEPRECATED for recipes: used only by legacy toolchain builders.
	// See also crbug/1019868.
	// Copy the orderfile from unvetted GS bucket to vetted bucket.
	UploadVettedAFDOArtifacts(ctx context.Context, in *VerifyAFDOArtifactsRequest, opts ...grpc.CallOption) (*VerifyAFDOArtifactsResponse, error)
	// Prepare to build toolchain artifacts.  This will be called twice:
	// Once with chroot and sysroot = None, before the chroot is created, and
	// again at the start of the 'install packages' step, if the build gets that
	// far.
	PrepareForBuild(ctx context.Context, in *PrepareForToolchainBuildRequest, opts ...grpc.CallOption) (*PrepareForToolchainBuildResponse, error)
	// Bundle toolchain artifacts.
	BundleArtifacts(ctx context.Context, in *BundleToolchainRequest, opts ...grpc.CallOption) (*BundleToolchainResponse, error)
	GetUpdatedFiles(ctx context.Context, in *GetUpdatedFilesRequest, opts ...grpc.CallOption) (*GetUpdatedFilesResponse, error)
}

type toolchainServiceClient struct {
	cc *grpc.ClientConn
}

func NewToolchainServiceClient(cc *grpc.ClientConn) ToolchainServiceClient {
	return &toolchainServiceClient{cc}
}

func (c *toolchainServiceClient) UpdateEbuildWithAFDOArtifacts(ctx context.Context, in *VerifyAFDOArtifactsRequest, opts ...grpc.CallOption) (*VerifyAFDOArtifactsResponse, error) {
	out := new(VerifyAFDOArtifactsResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ToolchainService/UpdateEbuildWithAFDOArtifacts", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *toolchainServiceClient) UploadVettedAFDOArtifacts(ctx context.Context, in *VerifyAFDOArtifactsRequest, opts ...grpc.CallOption) (*VerifyAFDOArtifactsResponse, error) {
	out := new(VerifyAFDOArtifactsResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ToolchainService/UploadVettedAFDOArtifacts", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *toolchainServiceClient) PrepareForBuild(ctx context.Context, in *PrepareForToolchainBuildRequest, opts ...grpc.CallOption) (*PrepareForToolchainBuildResponse, error) {
	out := new(PrepareForToolchainBuildResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ToolchainService/PrepareForBuild", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *toolchainServiceClient) BundleArtifacts(ctx context.Context, in *BundleToolchainRequest, opts ...grpc.CallOption) (*BundleToolchainResponse, error) {
	out := new(BundleToolchainResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ToolchainService/BundleArtifacts", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *toolchainServiceClient) GetUpdatedFiles(ctx context.Context, in *GetUpdatedFilesRequest, opts ...grpc.CallOption) (*GetUpdatedFilesResponse, error) {
	out := new(GetUpdatedFilesResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ToolchainService/GetUpdatedFiles", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// ToolchainServiceServer is the server API for ToolchainService service.
type ToolchainServiceServer interface {
	// DEPRECATED for recipes: used only by legacy toolchain builders.
	// See also crbug/1019868.
	// Update Chrome ebuild with most recent unvetted orderfile
	UpdateEbuildWithAFDOArtifacts(context.Context, *VerifyAFDOArtifactsRequest) (*VerifyAFDOArtifactsResponse, error)
	// DEPRECATED for recipes: used only by legacy toolchain builders.
	// See also crbug/1019868.
	// Copy the orderfile from unvetted GS bucket to vetted bucket.
	UploadVettedAFDOArtifacts(context.Context, *VerifyAFDOArtifactsRequest) (*VerifyAFDOArtifactsResponse, error)
	// Prepare to build toolchain artifacts.  This will be called twice:
	// Once with chroot and sysroot = None, before the chroot is created, and
	// again at the start of the 'install packages' step, if the build gets that
	// far.
	PrepareForBuild(context.Context, *PrepareForToolchainBuildRequest) (*PrepareForToolchainBuildResponse, error)
	// Bundle toolchain artifacts.
	BundleArtifacts(context.Context, *BundleToolchainRequest) (*BundleToolchainResponse, error)
	GetUpdatedFiles(context.Context, *GetUpdatedFilesRequest) (*GetUpdatedFilesResponse, error)
}

// UnimplementedToolchainServiceServer can be embedded to have forward compatible implementations.
type UnimplementedToolchainServiceServer struct {
}

func (*UnimplementedToolchainServiceServer) UpdateEbuildWithAFDOArtifacts(ctx context.Context, req *VerifyAFDOArtifactsRequest) (*VerifyAFDOArtifactsResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method UpdateEbuildWithAFDOArtifacts not implemented")
}
func (*UnimplementedToolchainServiceServer) UploadVettedAFDOArtifacts(ctx context.Context, req *VerifyAFDOArtifactsRequest) (*VerifyAFDOArtifactsResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method UploadVettedAFDOArtifacts not implemented")
}
func (*UnimplementedToolchainServiceServer) PrepareForBuild(ctx context.Context, req *PrepareForToolchainBuildRequest) (*PrepareForToolchainBuildResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method PrepareForBuild not implemented")
}
func (*UnimplementedToolchainServiceServer) BundleArtifacts(ctx context.Context, req *BundleToolchainRequest) (*BundleToolchainResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method BundleArtifacts not implemented")
}
func (*UnimplementedToolchainServiceServer) GetUpdatedFiles(ctx context.Context, req *GetUpdatedFilesRequest) (*GetUpdatedFilesResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetUpdatedFiles not implemented")
}

func RegisterToolchainServiceServer(s *grpc.Server, srv ToolchainServiceServer) {
	s.RegisterService(&_ToolchainService_serviceDesc, srv)
}

func _ToolchainService_UpdateEbuildWithAFDOArtifacts_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(VerifyAFDOArtifactsRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ToolchainServiceServer).UpdateEbuildWithAFDOArtifacts(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ToolchainService/UpdateEbuildWithAFDOArtifacts",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ToolchainServiceServer).UpdateEbuildWithAFDOArtifacts(ctx, req.(*VerifyAFDOArtifactsRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ToolchainService_UploadVettedAFDOArtifacts_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(VerifyAFDOArtifactsRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ToolchainServiceServer).UploadVettedAFDOArtifacts(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ToolchainService/UploadVettedAFDOArtifacts",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ToolchainServiceServer).UploadVettedAFDOArtifacts(ctx, req.(*VerifyAFDOArtifactsRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ToolchainService_PrepareForBuild_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(PrepareForToolchainBuildRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ToolchainServiceServer).PrepareForBuild(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ToolchainService/PrepareForBuild",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ToolchainServiceServer).PrepareForBuild(ctx, req.(*PrepareForToolchainBuildRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ToolchainService_BundleArtifacts_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BundleToolchainRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ToolchainServiceServer).BundleArtifacts(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ToolchainService/BundleArtifacts",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ToolchainServiceServer).BundleArtifacts(ctx, req.(*BundleToolchainRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ToolchainService_GetUpdatedFiles_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GetUpdatedFilesRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ToolchainServiceServer).GetUpdatedFiles(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ToolchainService/GetUpdatedFiles",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ToolchainServiceServer).GetUpdatedFiles(ctx, req.(*GetUpdatedFilesRequest))
	}
	return interceptor(ctx, in, info, handler)
}

var _ToolchainService_serviceDesc = grpc.ServiceDesc{
	ServiceName: "chromite.api.ToolchainService",
	HandlerType: (*ToolchainServiceServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "UpdateEbuildWithAFDOArtifacts",
			Handler:    _ToolchainService_UpdateEbuildWithAFDOArtifacts_Handler,
		},
		{
			MethodName: "UploadVettedAFDOArtifacts",
			Handler:    _ToolchainService_UploadVettedAFDOArtifacts_Handler,
		},
		{
			MethodName: "PrepareForBuild",
			Handler:    _ToolchainService_PrepareForBuild_Handler,
		},
		{
			MethodName: "BundleArtifacts",
			Handler:    _ToolchainService_BundleArtifacts_Handler,
		},
		{
			MethodName: "GetUpdatedFiles",
			Handler:    _ToolchainService_GetUpdatedFiles_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "chromite/api/toolchain.proto",
}
