// Code generated by protoc-gen-go. DO NOT EDIT.
// source: chromite/api/artifacts.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

// Whether this artifact requires a build.
type PrepareForBuildResponse_BuildRelevance int32

const (
	PrepareForBuildResponse_UNSPECIFIED PrepareForBuildResponse_BuildRelevance = 0
	// Build is necessary to generate artifacts.
	PrepareForBuildResponse_NEEDED PrepareForBuildResponse_BuildRelevance = 1
	// Defer to other artifacts.  Used primarily for aggregation of artifact
	// results.
	PrepareForBuildResponse_UNKNOWN PrepareForBuildResponse_BuildRelevance = 2
	// Artifacts are already generated.  The build is pointless.
	PrepareForBuildResponse_POINTLESS PrepareForBuildResponse_BuildRelevance = 3
)

var PrepareForBuildResponse_BuildRelevance_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "NEEDED",
	2: "UNKNOWN",
	3: "POINTLESS",
}

var PrepareForBuildResponse_BuildRelevance_value = map[string]int32{
	"UNSPECIFIED": 0,
	"NEEDED":      1,
	"UNKNOWN":     2,
	"POINTLESS":   3,
}

func (x PrepareForBuildResponse_BuildRelevance) String() string {
	return proto.EnumName(PrepareForBuildResponse_BuildRelevance_name, int32(x))
}

func (PrepareForBuildResponse_BuildRelevance) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_62a7d4c8524262a7, []int{2, 0}
}

// An artifact is a file generated during or after a build.
type Artifact struct {
	// Absolute path to the artifact 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 *Artifact) Reset()         { *m = Artifact{} }
func (m *Artifact) String() string { return proto.CompactTextString(m) }
func (*Artifact) ProtoMessage()    {}
func (*Artifact) Descriptor() ([]byte, []int) {
	return fileDescriptor_62a7d4c8524262a7, []int{0}
}

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

var xxx_messageInfo_Artifact proto.InternalMessageInfo

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

type PrepareForBuildRequest 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"`
	// Information about the artifacts.
	ArtifactInfo *chromiumos.ArtifactsByService `protobuf:"bytes,3,opt,name=artifact_info,json=artifactInfo,proto3" json:"artifact_info,omitempty"`
	// Whether we will proceed even if the build is POINTLESS.
	ForcedBuildRelevance bool     `protobuf:"varint,4,opt,name=forced_build_relevance,json=forcedBuildRelevance,proto3" json:"forced_build_relevance,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_PrepareForBuildRequest proto.InternalMessageInfo

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

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

func (m *PrepareForBuildRequest) GetArtifactInfo() *chromiumos.ArtifactsByService {
	if m != nil {
		return m.ArtifactInfo
	}
	return nil
}

func (m *PrepareForBuildRequest) GetForcedBuildRelevance() bool {
	if m != nil {
		return m.ForcedBuildRelevance
	}
	return false
}

type PrepareForBuildResponse struct {
	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 *PrepareForBuildResponse) Reset()         { *m = PrepareForBuildResponse{} }
func (m *PrepareForBuildResponse) String() string { return proto.CompactTextString(m) }
func (*PrepareForBuildResponse) ProtoMessage()    {}
func (*PrepareForBuildResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_62a7d4c8524262a7, []int{2}
}

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

var xxx_messageInfo_PrepareForBuildResponse proto.InternalMessageInfo

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

type GetRequest 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"`
	// Artifact information.
	ArtifactInfo *chromiumos.ArtifactsByService `protobuf:"bytes,3,opt,name=artifact_info,json=artifactInfo,proto3" json:"artifact_info,omitempty"`
	// Result path for artifacts.
	ResultPath           *chromiumos.ResultPath `protobuf:"bytes,4,opt,name=result_path,json=resultPath,proto3" json:"result_path,omitempty"`
	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
	XXX_unrecognized     []byte                 `json:"-"`
	XXX_sizecache        int32                  `json:"-"`
}

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

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

var xxx_messageInfo_GetRequest proto.InternalMessageInfo

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

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

func (m *GetRequest) GetArtifactInfo() *chromiumos.ArtifactsByService {
	if m != nil {
		return m.ArtifactInfo
	}
	return nil
}

func (m *GetRequest) GetResultPath() *chromiumos.ResultPath {
	if m != nil {
		return m.ResultPath
	}
	return nil
}

type GetResponse struct {
	// The artifacts that were bundled.
	Artifacts            *chromiumos.UploadedArtifactsByService `protobuf:"bytes,1,opt,name=artifacts,proto3" json:"artifacts,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                               `json:"-"`
	XXX_unrecognized     []byte                                 `json:"-"`
	XXX_sizecache        int32                                  `json:"-"`
}

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

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

var xxx_messageInfo_GetResponse proto.InternalMessageInfo

func (m *GetResponse) GetArtifacts() *chromiumos.UploadedArtifactsByService {
	if m != nil {
		return m.Artifacts
	}
	return nil
}

type BundleArtifactsRequest 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"`
	// Artifact information.
	ArtifactInfo *chromiumos.ArtifactsByService `protobuf:"bytes,3,opt,name=artifact_info,json=artifactInfo,proto3" json:"artifact_info,omitempty"`
	// Absolute path to the directory in which artifacts should be dropped.
	// TODO(crbug/1034529): Switch the recipes code to use result_path.
	OutputDir string `protobuf:"bytes,4,opt,name=output_dir,json=outputDir,proto3" json:"output_dir,omitempty"`
	// Result path for artifacts.  If present this overrides output_dir.
	ResultPath           *chromiumos.ResultPath `protobuf:"bytes,5,opt,name=result_path,json=resultPath,proto3" json:"result_path,omitempty"`
	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
	XXX_unrecognized     []byte                 `json:"-"`
	XXX_sizecache        int32                  `json:"-"`
}

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

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

var xxx_messageInfo_BundleArtifactsRequest proto.InternalMessageInfo

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

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

func (m *BundleArtifactsRequest) GetArtifactInfo() *chromiumos.ArtifactsByService {
	if m != nil {
		return m.ArtifactInfo
	}
	return nil
}

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

func (m *BundleArtifactsRequest) GetResultPath() *chromiumos.ResultPath {
	if m != nil {
		return m.ResultPath
	}
	return nil
}

type BundleArtifactsResponse struct {
	// The artifacts that were bundled.
	Artifacts            *chromiumos.UploadedArtifactsByService `protobuf:"bytes,1,opt,name=artifacts,proto3" json:"artifacts,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                               `json:"-"`
	XXX_unrecognized     []byte                                 `json:"-"`
	XXX_sizecache        int32                                  `json:"-"`
}

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

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

var xxx_messageInfo_BundleArtifactsResponse proto.InternalMessageInfo

func (m *BundleArtifactsResponse) GetArtifacts() *chromiumos.UploadedArtifactsByService {
	if m != nil {
		return m.Artifacts
	}
	return nil
}

// Request describing where build artifact bundles for a given build target
// should be dumped.
// TODO(crbug/1034529): BundleRequest and BundleResponse are being deprecated
// (along with most of this file).  See BundleArtifactsRequest/Response
type BundleRequest struct {
	// The build target to bundle artifacts for.
	// Deprecated. Use sysroot instead.
	BuildTarget *chromiumos.BuildTarget `protobuf:"bytes,1,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	// Absolute path to the directory in which artifacts should be dropped.
	OutputDir string `protobuf:"bytes,2,opt,name=output_dir,json=outputDir,proto3" json:"output_dir,omitempty"`
	// The chroot where the sysroot lives.
	Chroot *chromiumos.Chroot `protobuf:"bytes,3,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// The sysroot where the files live.
	Sysroot              *Sysroot `protobuf:"bytes,4,opt,name=sysroot,proto3" json:"sysroot,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_BundleRequest proto.InternalMessageInfo

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

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

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

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

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

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

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

var xxx_messageInfo_BundleResponse proto.InternalMessageInfo

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

// Request describing where to find build artifacts that are taken from a
// sysroot.
type BundleVmFilesRequest 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"`
	// Test results directory relative to the sysroot.
	TestResultsDir string `protobuf:"bytes,3,opt,name=test_results_dir,json=testResultsDir,proto3" json:"test_results_dir,omitempty"`
	// Absolute path to the directory in which artifacts should be dropped.
	OutputDir            string   `protobuf:"bytes,4,opt,name=output_dir,json=outputDir,proto3" json:"output_dir,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_BundleVmFilesRequest proto.InternalMessageInfo

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

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

func (m *BundleVmFilesRequest) GetTestResultsDir() string {
	if m != nil {
		return m.TestResultsDir
	}
	return ""
}

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

// DEPRECATED for recipes: crbug/1019868: This is being replaced with
// BundleRequest.
// Request describing where to find Chrome AFDO artifacts
type BundleChromeAFDORequest struct {
	// The chroot where the orderfile lives.
	Chroot *chromiumos.Chroot `protobuf:"bytes,1,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// The build_target of the builder.
	BuildTarget *chromiumos.BuildTarget `protobuf:"bytes,2,opt,name=build_target,json=buildTarget,proto3" json:"build_target,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"`
	// The type of AFDO artifact (benchmark-afdo or orderfile)
	ArtifactType         chromiumos.AFDOArtifactType `protobuf:"varint,4,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 *BundleChromeAFDORequest) Reset()         { *m = BundleChromeAFDORequest{} }
func (m *BundleChromeAFDORequest) String() string { return proto.CompactTextString(m) }
func (*BundleChromeAFDORequest) ProtoMessage()    {}
func (*BundleChromeAFDORequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_62a7d4c8524262a7, []int{10}
}

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

var xxx_messageInfo_BundleChromeAFDORequest proto.InternalMessageInfo

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

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

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

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

// Fetch the pinned guest image uris.
type PinnedGuestImageUriRequest 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"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_PinnedGuestImageUriRequest proto.InternalMessageInfo

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

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

// Response from fetching pinned guest image uris.
type PinnedGuestImageUriResponse struct {
	// The pinned guest images.
	PinnedImages         []*PinnedGuestImageUriResponse_PinnedGuestImage `protobuf:"bytes,1,rep,name=pinned_images,json=pinnedImages,proto3" json:"pinned_images,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                        `json:"-"`
	XXX_unrecognized     []byte                                          `json:"-"`
	XXX_sizecache        int32                                           `json:"-"`
}

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

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

var xxx_messageInfo_PinnedGuestImageUriResponse proto.InternalMessageInfo

func (m *PinnedGuestImageUriResponse) GetPinnedImages() []*PinnedGuestImageUriResponse_PinnedGuestImage {
	if m != nil {
		return m.PinnedImages
	}
	return nil
}

type PinnedGuestImageUriResponse_PinnedGuestImage struct {
	Filename             string   `protobuf:"bytes,1,opt,name=filename,proto3" json:"filename,omitempty"`
	Uri                  string   `protobuf:"bytes,2,opt,name=uri,proto3" json:"uri,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_PinnedGuestImageUriResponse_PinnedGuestImage proto.InternalMessageInfo

func (m *PinnedGuestImageUriResponse_PinnedGuestImage) GetFilename() string {
	if m != nil {
		return m.Filename
	}
	return ""
}

func (m *PinnedGuestImageUriResponse_PinnedGuestImage) GetUri() string {
	if m != nil {
		return m.Uri
	}
	return ""
}

func init() {
	proto.RegisterEnum("chromite.api.PrepareForBuildResponse_BuildRelevance", PrepareForBuildResponse_BuildRelevance_name, PrepareForBuildResponse_BuildRelevance_value)
	proto.RegisterType((*Artifact)(nil), "chromite.api.Artifact")
	proto.RegisterType((*PrepareForBuildRequest)(nil), "chromite.api.PrepareForBuildRequest")
	proto.RegisterType((*PrepareForBuildResponse)(nil), "chromite.api.PrepareForBuildResponse")
	proto.RegisterType((*GetRequest)(nil), "chromite.api.GetRequest")
	proto.RegisterType((*GetResponse)(nil), "chromite.api.GetResponse")
	proto.RegisterType((*BundleArtifactsRequest)(nil), "chromite.api.BundleArtifactsRequest")
	proto.RegisterType((*BundleArtifactsResponse)(nil), "chromite.api.BundleArtifactsResponse")
	proto.RegisterType((*BundleRequest)(nil), "chromite.api.BundleRequest")
	proto.RegisterType((*BundleResponse)(nil), "chromite.api.BundleResponse")
	proto.RegisterType((*BundleVmFilesRequest)(nil), "chromite.api.BundleVmFilesRequest")
	proto.RegisterType((*BundleChromeAFDORequest)(nil), "chromite.api.BundleChromeAFDORequest")
	proto.RegisterType((*PinnedGuestImageUriRequest)(nil), "chromite.api.PinnedGuestImageUriRequest")
	proto.RegisterType((*PinnedGuestImageUriResponse)(nil), "chromite.api.PinnedGuestImageUriResponse")
	proto.RegisterType((*PinnedGuestImageUriResponse_PinnedGuestImage)(nil), "chromite.api.PinnedGuestImageUriResponse.PinnedGuestImage")
}

func init() { proto.RegisterFile("chromite/api/artifacts.proto", fileDescriptor_62a7d4c8524262a7) }

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

// ArtifactsServiceClient is the client API for ArtifactsService service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type ArtifactsServiceClient interface {
	// Prepare to build artifacts.
	PrepareForBuild(ctx context.Context, in *PrepareForBuildRequest, opts ...grpc.CallOption) (*PrepareForBuildResponse, error)
	// Get artifacts for build.
	Get(ctx context.Context, in *GetRequest, opts ...grpc.CallOption) (*GetResponse, error)
	// Fetch the pinned guest image locations.
	FetchPinnedGuestImageUris(ctx context.Context, in *PinnedGuestImageUriRequest, opts ...grpc.CallOption) (*PinnedGuestImageUriResponse, error)
	// TODO(crbug/1034529): DEPRECATED use Get
	// Create a tar archive with all files needed for Autotest HW testing.
	BundleAutotestFiles(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use Get
	// Create the ChromeOS Config JSON payload.
	BundleChromeOSConfig(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use Get
	// Create a tar archive of debug symbols.
	BundleDebugSymbols(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use Get
	// Create a tar archive with ebuild logs.
	BundleEbuildLogs(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use Get
	// Create a tar archive with unsigned firmware images.
	BundleFirmware(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use Get
	// Create a tar.xz archive for each image that has been created.
	BundleImageArchives(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use Get
	// Generate zip containing all built images for the target.
	BundleImageZip(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use Get
	// DEPRECATED for recipes: crbug/1019868: This are being replaced by
	// ToolchainService.Bundle{ArtifactType}()
	// Create Chrome Benchmark AFDO builder artifacts.
	BundleAFDOGenerationArtifacts(ctx context.Context, in *BundleChromeAFDORequest, opts ...grpc.CallOption) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use Get
	// Create a tar archive with all guest images test bundles.
	BundlePinnedGuestImages(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use Get
	// Create the simple chrome artifacts.
	BundleSimpleChromeArtifacts(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use Get
	// Create a tar archive with all files needed for Tast HW testing.
	BundleTastFiles(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use Get
	// Generate minimal update payloads to be used in HW testing.
	BundleTestUpdatePayloads(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use Get
	// Create a tar archive with VM memory and disk images.
	BundleVmFiles(ctx context.Context, in *BundleVmFilesRequest, opts ...grpc.CallOption) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use Get
	// Generate a CPE report to a file.
	ExportCpeReport(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use Get
	// Create a tar archive with fingerprint MCU on-device unittest binaries.
	BundleFpmcuUnittests(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use Get
	// Create a tarball from the test image suitable for importing into GCE.
	BundleGceTarball(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error)
	// Generate all Remote Test Driver metadata.
	//
	// Response consists of one or more metadata files. Each file must contain a
	// single binary encoded chromiumos.config.api.test.metadata.v1.Specification
	// protobuf payload.
	// Schema defined at
	// https://chromium.googlesource.com/chromiumos/config/+/refs/heads/master/proto/chromiumos/config/api/test/metadata/v1/metadata.proto
	//
	// These artifacts partially replace chromiumos.ArtifactsByService.Test
	// artifacts. See also, GenerateRemoteTestDriverImages()
	//
	// TODO(crbug/1034529): DEPRECATED use Get
	GenerateRemoteTestDriverSpecification(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error)
	// Generate all Remote Test Driver container images.
	//
	// Response consists of one or more Docker container images.
	// The images are identified by their Docker image digest. The filenames of
	// the created artifacts are ignored.
	//
	// These artifacts partially replace chromiumos.ArtifactsByService.Test
	// artifacts. See also, GenerateRemoteTestDriverSpecification()
	//
	// TODO(crbug/1034529): DEPRECATED use Get
	GenerateRemoteTestDriverImages(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error)
}

type artifactsServiceClient struct {
	cc *grpc.ClientConn
}

func NewArtifactsServiceClient(cc *grpc.ClientConn) ArtifactsServiceClient {
	return &artifactsServiceClient{cc}
}

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

func (c *artifactsServiceClient) Get(ctx context.Context, in *GetRequest, opts ...grpc.CallOption) (*GetResponse, error) {
	out := new(GetResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ArtifactsService/Get", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *artifactsServiceClient) FetchPinnedGuestImageUris(ctx context.Context, in *PinnedGuestImageUriRequest, opts ...grpc.CallOption) (*PinnedGuestImageUriResponse, error) {
	out := new(PinnedGuestImageUriResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ArtifactsService/FetchPinnedGuestImageUris", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *artifactsServiceClient) BundleAutotestFiles(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error) {
	out := new(BundleResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ArtifactsService/BundleAutotestFiles", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *artifactsServiceClient) BundleChromeOSConfig(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error) {
	out := new(BundleResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ArtifactsService/BundleChromeOSConfig", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *artifactsServiceClient) BundleDebugSymbols(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error) {
	out := new(BundleResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ArtifactsService/BundleDebugSymbols", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *artifactsServiceClient) BundleEbuildLogs(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error) {
	out := new(BundleResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ArtifactsService/BundleEbuildLogs", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *artifactsServiceClient) BundleFirmware(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error) {
	out := new(BundleResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ArtifactsService/BundleFirmware", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *artifactsServiceClient) BundleImageArchives(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error) {
	out := new(BundleResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ArtifactsService/BundleImageArchives", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *artifactsServiceClient) BundleImageZip(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error) {
	out := new(BundleResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ArtifactsService/BundleImageZip", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *artifactsServiceClient) BundleAFDOGenerationArtifacts(ctx context.Context, in *BundleChromeAFDORequest, opts ...grpc.CallOption) (*BundleResponse, error) {
	out := new(BundleResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ArtifactsService/BundleAFDOGenerationArtifacts", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *artifactsServiceClient) BundlePinnedGuestImages(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error) {
	out := new(BundleResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ArtifactsService/BundlePinnedGuestImages", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *artifactsServiceClient) BundleSimpleChromeArtifacts(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error) {
	out := new(BundleResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ArtifactsService/BundleSimpleChromeArtifacts", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *artifactsServiceClient) BundleTastFiles(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error) {
	out := new(BundleResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ArtifactsService/BundleTastFiles", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *artifactsServiceClient) BundleTestUpdatePayloads(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error) {
	out := new(BundleResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ArtifactsService/BundleTestUpdatePayloads", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *artifactsServiceClient) BundleVmFiles(ctx context.Context, in *BundleVmFilesRequest, opts ...grpc.CallOption) (*BundleResponse, error) {
	out := new(BundleResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ArtifactsService/BundleVmFiles", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *artifactsServiceClient) ExportCpeReport(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error) {
	out := new(BundleResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ArtifactsService/ExportCpeReport", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *artifactsServiceClient) BundleFpmcuUnittests(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error) {
	out := new(BundleResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ArtifactsService/BundleFpmcuUnittests", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *artifactsServiceClient) BundleGceTarball(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error) {
	out := new(BundleResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ArtifactsService/BundleGceTarball", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *artifactsServiceClient) GenerateRemoteTestDriverSpecification(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error) {
	out := new(BundleResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ArtifactsService/GenerateRemoteTestDriverSpecification", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *artifactsServiceClient) GenerateRemoteTestDriverImages(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error) {
	out := new(BundleResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ArtifactsService/GenerateRemoteTestDriverImages", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// ArtifactsServiceServer is the server API for ArtifactsService service.
type ArtifactsServiceServer interface {
	// Prepare to build artifacts.
	PrepareForBuild(context.Context, *PrepareForBuildRequest) (*PrepareForBuildResponse, error)
	// Get artifacts for build.
	Get(context.Context, *GetRequest) (*GetResponse, error)
	// Fetch the pinned guest image locations.
	FetchPinnedGuestImageUris(context.Context, *PinnedGuestImageUriRequest) (*PinnedGuestImageUriResponse, error)
	// TODO(crbug/1034529): DEPRECATED use Get
	// Create a tar archive with all files needed for Autotest HW testing.
	BundleAutotestFiles(context.Context, *BundleRequest) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use Get
	// Create the ChromeOS Config JSON payload.
	BundleChromeOSConfig(context.Context, *BundleRequest) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use Get
	// Create a tar archive of debug symbols.
	BundleDebugSymbols(context.Context, *BundleRequest) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use Get
	// Create a tar archive with ebuild logs.
	BundleEbuildLogs(context.Context, *BundleRequest) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use Get
	// Create a tar archive with unsigned firmware images.
	BundleFirmware(context.Context, *BundleRequest) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use Get
	// Create a tar.xz archive for each image that has been created.
	BundleImageArchives(context.Context, *BundleRequest) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use Get
	// Generate zip containing all built images for the target.
	BundleImageZip(context.Context, *BundleRequest) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use Get
	// DEPRECATED for recipes: crbug/1019868: This are being replaced by
	// ToolchainService.Bundle{ArtifactType}()
	// Create Chrome Benchmark AFDO builder artifacts.
	BundleAFDOGenerationArtifacts(context.Context, *BundleChromeAFDORequest) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use Get
	// Create a tar archive with all guest images test bundles.
	BundlePinnedGuestImages(context.Context, *BundleRequest) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use Get
	// Create the simple chrome artifacts.
	BundleSimpleChromeArtifacts(context.Context, *BundleRequest) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use Get
	// Create a tar archive with all files needed for Tast HW testing.
	BundleTastFiles(context.Context, *BundleRequest) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use Get
	// Generate minimal update payloads to be used in HW testing.
	BundleTestUpdatePayloads(context.Context, *BundleRequest) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use Get
	// Create a tar archive with VM memory and disk images.
	BundleVmFiles(context.Context, *BundleVmFilesRequest) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use Get
	// Generate a CPE report to a file.
	ExportCpeReport(context.Context, *BundleRequest) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use Get
	// Create a tar archive with fingerprint MCU on-device unittest binaries.
	BundleFpmcuUnittests(context.Context, *BundleRequest) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use Get
	// Create a tarball from the test image suitable for importing into GCE.
	BundleGceTarball(context.Context, *BundleRequest) (*BundleResponse, error)
	// Generate all Remote Test Driver metadata.
	//
	// Response consists of one or more metadata files. Each file must contain a
	// single binary encoded chromiumos.config.api.test.metadata.v1.Specification
	// protobuf payload.
	// Schema defined at
	// https://chromium.googlesource.com/chromiumos/config/+/refs/heads/master/proto/chromiumos/config/api/test/metadata/v1/metadata.proto
	//
	// These artifacts partially replace chromiumos.ArtifactsByService.Test
	// artifacts. See also, GenerateRemoteTestDriverImages()
	//
	// TODO(crbug/1034529): DEPRECATED use Get
	GenerateRemoteTestDriverSpecification(context.Context, *BundleRequest) (*BundleResponse, error)
	// Generate all Remote Test Driver container images.
	//
	// Response consists of one or more Docker container images.
	// The images are identified by their Docker image digest. The filenames of
	// the created artifacts are ignored.
	//
	// These artifacts partially replace chromiumos.ArtifactsByService.Test
	// artifacts. See also, GenerateRemoteTestDriverSpecification()
	//
	// TODO(crbug/1034529): DEPRECATED use Get
	GenerateRemoteTestDriverImages(context.Context, *BundleRequest) (*BundleResponse, error)
}

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

func (*UnimplementedArtifactsServiceServer) PrepareForBuild(ctx context.Context, req *PrepareForBuildRequest) (*PrepareForBuildResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method PrepareForBuild not implemented")
}
func (*UnimplementedArtifactsServiceServer) Get(ctx context.Context, req *GetRequest) (*GetResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method Get not implemented")
}
func (*UnimplementedArtifactsServiceServer) FetchPinnedGuestImageUris(ctx context.Context, req *PinnedGuestImageUriRequest) (*PinnedGuestImageUriResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method FetchPinnedGuestImageUris not implemented")
}
func (*UnimplementedArtifactsServiceServer) BundleAutotestFiles(ctx context.Context, req *BundleRequest) (*BundleResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method BundleAutotestFiles not implemented")
}
func (*UnimplementedArtifactsServiceServer) BundleChromeOSConfig(ctx context.Context, req *BundleRequest) (*BundleResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method BundleChromeOSConfig not implemented")
}
func (*UnimplementedArtifactsServiceServer) BundleDebugSymbols(ctx context.Context, req *BundleRequest) (*BundleResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method BundleDebugSymbols not implemented")
}
func (*UnimplementedArtifactsServiceServer) BundleEbuildLogs(ctx context.Context, req *BundleRequest) (*BundleResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method BundleEbuildLogs not implemented")
}
func (*UnimplementedArtifactsServiceServer) BundleFirmware(ctx context.Context, req *BundleRequest) (*BundleResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method BundleFirmware not implemented")
}
func (*UnimplementedArtifactsServiceServer) BundleImageArchives(ctx context.Context, req *BundleRequest) (*BundleResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method BundleImageArchives not implemented")
}
func (*UnimplementedArtifactsServiceServer) BundleImageZip(ctx context.Context, req *BundleRequest) (*BundleResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method BundleImageZip not implemented")
}
func (*UnimplementedArtifactsServiceServer) BundleAFDOGenerationArtifacts(ctx context.Context, req *BundleChromeAFDORequest) (*BundleResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method BundleAFDOGenerationArtifacts not implemented")
}
func (*UnimplementedArtifactsServiceServer) BundlePinnedGuestImages(ctx context.Context, req *BundleRequest) (*BundleResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method BundlePinnedGuestImages not implemented")
}
func (*UnimplementedArtifactsServiceServer) BundleSimpleChromeArtifacts(ctx context.Context, req *BundleRequest) (*BundleResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method BundleSimpleChromeArtifacts not implemented")
}
func (*UnimplementedArtifactsServiceServer) BundleTastFiles(ctx context.Context, req *BundleRequest) (*BundleResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method BundleTastFiles not implemented")
}
func (*UnimplementedArtifactsServiceServer) BundleTestUpdatePayloads(ctx context.Context, req *BundleRequest) (*BundleResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method BundleTestUpdatePayloads not implemented")
}
func (*UnimplementedArtifactsServiceServer) BundleVmFiles(ctx context.Context, req *BundleVmFilesRequest) (*BundleResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method BundleVmFiles not implemented")
}
func (*UnimplementedArtifactsServiceServer) ExportCpeReport(ctx context.Context, req *BundleRequest) (*BundleResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method ExportCpeReport not implemented")
}
func (*UnimplementedArtifactsServiceServer) BundleFpmcuUnittests(ctx context.Context, req *BundleRequest) (*BundleResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method BundleFpmcuUnittests not implemented")
}
func (*UnimplementedArtifactsServiceServer) BundleGceTarball(ctx context.Context, req *BundleRequest) (*BundleResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method BundleGceTarball not implemented")
}
func (*UnimplementedArtifactsServiceServer) GenerateRemoteTestDriverSpecification(ctx context.Context, req *BundleRequest) (*BundleResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GenerateRemoteTestDriverSpecification not implemented")
}
func (*UnimplementedArtifactsServiceServer) GenerateRemoteTestDriverImages(ctx context.Context, req *BundleRequest) (*BundleResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GenerateRemoteTestDriverImages not implemented")
}

func RegisterArtifactsServiceServer(s *grpc.Server, srv ArtifactsServiceServer) {
	s.RegisterService(&_ArtifactsService_serviceDesc, srv)
}

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

func _ArtifactsService_Get_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GetRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ArtifactsServiceServer).Get(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ArtifactsService/Get",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ArtifactsServiceServer).Get(ctx, req.(*GetRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ArtifactsService_FetchPinnedGuestImageUris_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(PinnedGuestImageUriRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ArtifactsServiceServer).FetchPinnedGuestImageUris(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ArtifactsService/FetchPinnedGuestImageUris",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ArtifactsServiceServer).FetchPinnedGuestImageUris(ctx, req.(*PinnedGuestImageUriRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ArtifactsService_BundleAutotestFiles_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BundleRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ArtifactsServiceServer).BundleAutotestFiles(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ArtifactsService/BundleAutotestFiles",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ArtifactsServiceServer).BundleAutotestFiles(ctx, req.(*BundleRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ArtifactsService_BundleChromeOSConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BundleRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ArtifactsServiceServer).BundleChromeOSConfig(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ArtifactsService/BundleChromeOSConfig",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ArtifactsServiceServer).BundleChromeOSConfig(ctx, req.(*BundleRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ArtifactsService_BundleDebugSymbols_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BundleRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ArtifactsServiceServer).BundleDebugSymbols(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ArtifactsService/BundleDebugSymbols",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ArtifactsServiceServer).BundleDebugSymbols(ctx, req.(*BundleRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ArtifactsService_BundleEbuildLogs_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BundleRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ArtifactsServiceServer).BundleEbuildLogs(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ArtifactsService/BundleEbuildLogs",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ArtifactsServiceServer).BundleEbuildLogs(ctx, req.(*BundleRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ArtifactsService_BundleFirmware_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BundleRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ArtifactsServiceServer).BundleFirmware(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ArtifactsService/BundleFirmware",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ArtifactsServiceServer).BundleFirmware(ctx, req.(*BundleRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ArtifactsService_BundleImageArchives_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BundleRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ArtifactsServiceServer).BundleImageArchives(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ArtifactsService/BundleImageArchives",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ArtifactsServiceServer).BundleImageArchives(ctx, req.(*BundleRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ArtifactsService_BundleImageZip_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BundleRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ArtifactsServiceServer).BundleImageZip(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ArtifactsService/BundleImageZip",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ArtifactsServiceServer).BundleImageZip(ctx, req.(*BundleRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ArtifactsService_BundleAFDOGenerationArtifacts_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BundleChromeAFDORequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ArtifactsServiceServer).BundleAFDOGenerationArtifacts(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ArtifactsService/BundleAFDOGenerationArtifacts",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ArtifactsServiceServer).BundleAFDOGenerationArtifacts(ctx, req.(*BundleChromeAFDORequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ArtifactsService_BundlePinnedGuestImages_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BundleRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ArtifactsServiceServer).BundlePinnedGuestImages(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ArtifactsService/BundlePinnedGuestImages",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ArtifactsServiceServer).BundlePinnedGuestImages(ctx, req.(*BundleRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ArtifactsService_BundleSimpleChromeArtifacts_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BundleRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ArtifactsServiceServer).BundleSimpleChromeArtifacts(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ArtifactsService/BundleSimpleChromeArtifacts",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ArtifactsServiceServer).BundleSimpleChromeArtifacts(ctx, req.(*BundleRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ArtifactsService_BundleTastFiles_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BundleRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ArtifactsServiceServer).BundleTastFiles(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ArtifactsService/BundleTastFiles",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ArtifactsServiceServer).BundleTastFiles(ctx, req.(*BundleRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ArtifactsService_BundleTestUpdatePayloads_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BundleRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ArtifactsServiceServer).BundleTestUpdatePayloads(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ArtifactsService/BundleTestUpdatePayloads",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ArtifactsServiceServer).BundleTestUpdatePayloads(ctx, req.(*BundleRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ArtifactsService_BundleVmFiles_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BundleVmFilesRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ArtifactsServiceServer).BundleVmFiles(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ArtifactsService/BundleVmFiles",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ArtifactsServiceServer).BundleVmFiles(ctx, req.(*BundleVmFilesRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ArtifactsService_ExportCpeReport_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BundleRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ArtifactsServiceServer).ExportCpeReport(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ArtifactsService/ExportCpeReport",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ArtifactsServiceServer).ExportCpeReport(ctx, req.(*BundleRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ArtifactsService_BundleFpmcuUnittests_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BundleRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ArtifactsServiceServer).BundleFpmcuUnittests(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ArtifactsService/BundleFpmcuUnittests",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ArtifactsServiceServer).BundleFpmcuUnittests(ctx, req.(*BundleRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ArtifactsService_BundleGceTarball_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BundleRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ArtifactsServiceServer).BundleGceTarball(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ArtifactsService/BundleGceTarball",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ArtifactsServiceServer).BundleGceTarball(ctx, req.(*BundleRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ArtifactsService_GenerateRemoteTestDriverSpecification_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BundleRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ArtifactsServiceServer).GenerateRemoteTestDriverSpecification(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ArtifactsService/GenerateRemoteTestDriverSpecification",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ArtifactsServiceServer).GenerateRemoteTestDriverSpecification(ctx, req.(*BundleRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ArtifactsService_GenerateRemoteTestDriverImages_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BundleRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ArtifactsServiceServer).GenerateRemoteTestDriverImages(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ArtifactsService/GenerateRemoteTestDriverImages",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ArtifactsServiceServer).GenerateRemoteTestDriverImages(ctx, req.(*BundleRequest))
	}
	return interceptor(ctx, in, info, handler)
}

var _ArtifactsService_serviceDesc = grpc.ServiceDesc{
	ServiceName: "chromite.api.ArtifactsService",
	HandlerType: (*ArtifactsServiceServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "PrepareForBuild",
			Handler:    _ArtifactsService_PrepareForBuild_Handler,
		},
		{
			MethodName: "Get",
			Handler:    _ArtifactsService_Get_Handler,
		},
		{
			MethodName: "FetchPinnedGuestImageUris",
			Handler:    _ArtifactsService_FetchPinnedGuestImageUris_Handler,
		},
		{
			MethodName: "BundleAutotestFiles",
			Handler:    _ArtifactsService_BundleAutotestFiles_Handler,
		},
		{
			MethodName: "BundleChromeOSConfig",
			Handler:    _ArtifactsService_BundleChromeOSConfig_Handler,
		},
		{
			MethodName: "BundleDebugSymbols",
			Handler:    _ArtifactsService_BundleDebugSymbols_Handler,
		},
		{
			MethodName: "BundleEbuildLogs",
			Handler:    _ArtifactsService_BundleEbuildLogs_Handler,
		},
		{
			MethodName: "BundleFirmware",
			Handler:    _ArtifactsService_BundleFirmware_Handler,
		},
		{
			MethodName: "BundleImageArchives",
			Handler:    _ArtifactsService_BundleImageArchives_Handler,
		},
		{
			MethodName: "BundleImageZip",
			Handler:    _ArtifactsService_BundleImageZip_Handler,
		},
		{
			MethodName: "BundleAFDOGenerationArtifacts",
			Handler:    _ArtifactsService_BundleAFDOGenerationArtifacts_Handler,
		},
		{
			MethodName: "BundlePinnedGuestImages",
			Handler:    _ArtifactsService_BundlePinnedGuestImages_Handler,
		},
		{
			MethodName: "BundleSimpleChromeArtifacts",
			Handler:    _ArtifactsService_BundleSimpleChromeArtifacts_Handler,
		},
		{
			MethodName: "BundleTastFiles",
			Handler:    _ArtifactsService_BundleTastFiles_Handler,
		},
		{
			MethodName: "BundleTestUpdatePayloads",
			Handler:    _ArtifactsService_BundleTestUpdatePayloads_Handler,
		},
		{
			MethodName: "BundleVmFiles",
			Handler:    _ArtifactsService_BundleVmFiles_Handler,
		},
		{
			MethodName: "ExportCpeReport",
			Handler:    _ArtifactsService_ExportCpeReport_Handler,
		},
		{
			MethodName: "BundleFpmcuUnittests",
			Handler:    _ArtifactsService_BundleFpmcuUnittests_Handler,
		},
		{
			MethodName: "BundleGceTarball",
			Handler:    _ArtifactsService_BundleGceTarball_Handler,
		},
		{
			MethodName: "GenerateRemoteTestDriverSpecification",
			Handler:    _ArtifactsService_GenerateRemoteTestDriverSpecification_Handler,
		},
		{
			MethodName: "GenerateRemoteTestDriverImages",
			Handler:    _ArtifactsService_GenerateRemoteTestDriverImages_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "chromite/api/artifacts.proto",
}
