// 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 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{5}
}

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{6}
}

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

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
}

// 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)
}

// 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 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)
}

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,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "chromite/api/toolchain.proto",
}
