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

// Defines a single build directory in storage.
type Build struct {
	// The board of the image "x86-mario", etc.
	BuildTarget *chromiumos.BuildTarget `protobuf:"bytes,1,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	// The version of the image. "0.14.23.2", "3401.0.0", etc.
	Version string `protobuf:"bytes,2,opt,name=version,proto3" json:"version,omitempty"`
	// The bucket of the image. "chromeos-releases" as default.
	Bucket string `protobuf:"bytes,3,opt,name=bucket,proto3" json:"bucket,omitempty"`
	// The channel of the image "stable-channel", "nplusone", etc.
	Channel              string   `protobuf:"bytes,4,opt,name=channel,proto3" json:"channel,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Build proto.InternalMessageInfo

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

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

func (m *Build) GetBucket() string {
	if m != nil {
		return m.Bucket
	}
	return ""
}

func (m *Build) GetChannel() string {
	if m != nil {
		return m.Channel
	}
	return ""
}

// Define a signed ChromeOS image archived.
type SignedImage struct {
	// An instance of Build that defines the build artifacts directory.
	Build *Build `protobuf:"bytes,1,opt,name=build,proto3" json:"build,omitempty"`
	// The type of the image. Currently, "recovery" or "base" types are supported.
	ImageType chromiumos.ImageType `protobuf:"varint,2,opt,name=image_type,json=imageType,proto3,enum=chromiumos.ImageType" json:"image_type,omitempty"`
	// The key the image was signed with. "premp", "mp", "mp-v2". This is not the
	// board specific key name, but the general value used in image/payload names.
	Key                  string   `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_SignedImage proto.InternalMessageInfo

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

func (m *SignedImage) GetImageType() chromiumos.ImageType {
	if m != nil {
		return m.ImageType
	}
	return chromiumos.ImageType_IMAGE_TYPE_UNDEFINED
}

func (m *SignedImage) GetKey() string {
	if m != nil {
		return m.Key
	}
	return ""
}

// Define a unsigned ChromeOS image archived.
type UnsignedImage struct {
	// An instance of Build that defines the build artifacts directory.
	Build *Build `protobuf:"bytes,1,opt,name=build,proto3" json:"build,omitempty"`
	/// The type of the image. Currently one of "test", "recovery", or "base".
	ImageType chromiumos.ImageType `protobuf:"varint,2,opt,name=image_type,json=imageType,proto3,enum=chromiumos.ImageType" json:"image_type,omitempty"`
	// The most recent branch corresponding to the version; "R19" etc.
	Milestone            string   `protobuf:"bytes,3,opt,name=milestone,proto3" json:"milestone,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_UnsignedImage proto.InternalMessageInfo

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

func (m *UnsignedImage) GetImageType() chromiumos.ImageType {
	if m != nil {
		return m.ImageType
	}
	return chromiumos.ImageType_IMAGE_TYPE_UNDEFINED
}

func (m *UnsignedImage) GetMilestone() string {
	if m != nil {
		return m.Milestone
	}
	return ""
}

// Request payload generation to be done with a source and target image.
type PayloadGenerationRequest struct {
	// Source image properties, must be either full_update or the same type as
	// the included tgt_image_oneof. full_update indicates the lack of a source.
	//
	// Types that are valid to be assigned to SrcImageOneof:
	//	*PayloadGenerationRequest_FullUpdate
	//	*PayloadGenerationRequest_SrcSignedImage
	//	*PayloadGenerationRequest_SrcUnsignedImage
	SrcImageOneof isPayloadGenerationRequest_SrcImageOneof `protobuf_oneof:"src_image_oneof"`
	// Target image properties.
	//
	// Types that are valid to be assigned to TgtImageOneof:
	//	*PayloadGenerationRequest_TgtSignedImage
	//	*PayloadGenerationRequest_TgtUnsignedImage
	TgtImageOneof isPayloadGenerationRequest_TgtImageOneof `protobuf_oneof:"tgt_image_oneof"`
	// The destination bucket (defaults to "chromeos-releases").
	Bucket string `protobuf:"bytes,6,opt,name=bucket,proto3" json:"bucket,omitempty"`
	// Should we run verification?
	Verify bool `protobuf:"varint,7,opt,name=verify,proto3" json:"verify,omitempty"`
	// The keyset to sign with (e.g. "coral-mp-v16"), if empty do not sign.
	Keyset               string   `protobuf:"bytes,8,opt,name=keyset,proto3" json:"keyset,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_PayloadGenerationRequest proto.InternalMessageInfo

type isPayloadGenerationRequest_SrcImageOneof interface {
	isPayloadGenerationRequest_SrcImageOneof()
}

type PayloadGenerationRequest_FullUpdate struct {
	FullUpdate bool `protobuf:"varint,1,opt,name=full_update,json=fullUpdate,proto3,oneof"`
}

type PayloadGenerationRequest_SrcSignedImage struct {
	SrcSignedImage *SignedImage `protobuf:"bytes,2,opt,name=src_signed_image,json=srcSignedImage,proto3,oneof"`
}

type PayloadGenerationRequest_SrcUnsignedImage struct {
	SrcUnsignedImage *UnsignedImage `protobuf:"bytes,3,opt,name=src_unsigned_image,json=srcUnsignedImage,proto3,oneof"`
}

func (*PayloadGenerationRequest_FullUpdate) isPayloadGenerationRequest_SrcImageOneof() {}

func (*PayloadGenerationRequest_SrcSignedImage) isPayloadGenerationRequest_SrcImageOneof() {}

func (*PayloadGenerationRequest_SrcUnsignedImage) isPayloadGenerationRequest_SrcImageOneof() {}

func (m *PayloadGenerationRequest) GetSrcImageOneof() isPayloadGenerationRequest_SrcImageOneof {
	if m != nil {
		return m.SrcImageOneof
	}
	return nil
}

func (m *PayloadGenerationRequest) GetFullUpdate() bool {
	if x, ok := m.GetSrcImageOneof().(*PayloadGenerationRequest_FullUpdate); ok {
		return x.FullUpdate
	}
	return false
}

func (m *PayloadGenerationRequest) GetSrcSignedImage() *SignedImage {
	if x, ok := m.GetSrcImageOneof().(*PayloadGenerationRequest_SrcSignedImage); ok {
		return x.SrcSignedImage
	}
	return nil
}

func (m *PayloadGenerationRequest) GetSrcUnsignedImage() *UnsignedImage {
	if x, ok := m.GetSrcImageOneof().(*PayloadGenerationRequest_SrcUnsignedImage); ok {
		return x.SrcUnsignedImage
	}
	return nil
}

type isPayloadGenerationRequest_TgtImageOneof interface {
	isPayloadGenerationRequest_TgtImageOneof()
}

type PayloadGenerationRequest_TgtSignedImage struct {
	TgtSignedImage *SignedImage `protobuf:"bytes,4,opt,name=tgt_signed_image,json=tgtSignedImage,proto3,oneof"`
}

type PayloadGenerationRequest_TgtUnsignedImage struct {
	TgtUnsignedImage *UnsignedImage `protobuf:"bytes,5,opt,name=tgt_unsigned_image,json=tgtUnsignedImage,proto3,oneof"`
}

func (*PayloadGenerationRequest_TgtSignedImage) isPayloadGenerationRequest_TgtImageOneof() {}

func (*PayloadGenerationRequest_TgtUnsignedImage) isPayloadGenerationRequest_TgtImageOneof() {}

func (m *PayloadGenerationRequest) GetTgtImageOneof() isPayloadGenerationRequest_TgtImageOneof {
	if m != nil {
		return m.TgtImageOneof
	}
	return nil
}

func (m *PayloadGenerationRequest) GetTgtSignedImage() *SignedImage {
	if x, ok := m.GetTgtImageOneof().(*PayloadGenerationRequest_TgtSignedImage); ok {
		return x.TgtSignedImage
	}
	return nil
}

func (m *PayloadGenerationRequest) GetTgtUnsignedImage() *UnsignedImage {
	if x, ok := m.GetTgtImageOneof().(*PayloadGenerationRequest_TgtUnsignedImage); ok {
		return x.TgtUnsignedImage
	}
	return nil
}

func (m *PayloadGenerationRequest) GetBucket() string {
	if m != nil {
		return m.Bucket
	}
	return ""
}

func (m *PayloadGenerationRequest) GetVerify() bool {
	if m != nil {
		return m.Verify
	}
	return false
}

func (m *PayloadGenerationRequest) GetKeyset() string {
	if m != nil {
		return m.Keyset
	}
	return ""
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*PayloadGenerationRequest) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*PayloadGenerationRequest_FullUpdate)(nil),
		(*PayloadGenerationRequest_SrcSignedImage)(nil),
		(*PayloadGenerationRequest_SrcUnsignedImage)(nil),
		(*PayloadGenerationRequest_TgtSignedImage)(nil),
		(*PayloadGenerationRequest_TgtUnsignedImage)(nil),
	}
}

// Result of a payload generation.
type PayloadGenerationResult struct {
	// Whether we've completed successfully.
	Success              bool     `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_PayloadGenerationResult proto.InternalMessageInfo

func (m *PayloadGenerationResult) GetSuccess() bool {
	if m != nil {
		return m.Success
	}
	return false
}

func init() {
	proto.RegisterType((*Build)(nil), "chromite.api.Build")
	proto.RegisterType((*SignedImage)(nil), "chromite.api.SignedImage")
	proto.RegisterType((*UnsignedImage)(nil), "chromite.api.UnsignedImage")
	proto.RegisterType((*PayloadGenerationRequest)(nil), "chromite.api.PayloadGenerationRequest")
	proto.RegisterType((*PayloadGenerationResult)(nil), "chromite.api.PayloadGenerationResult")
}

func init() { proto.RegisterFile("chromite/api/payload.proto", fileDescriptor_0ecdf1e4e8bef7a4) }

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

// PayloadServiceClient is the client API for PayloadService service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type PayloadServiceClient interface {
	GeneratePayload(ctx context.Context, in *PayloadGenerationRequest, opts ...grpc.CallOption) (*PayloadGenerationResult, error)
}

type payloadServiceClient struct {
	cc *grpc.ClientConn
}

func NewPayloadServiceClient(cc *grpc.ClientConn) PayloadServiceClient {
	return &payloadServiceClient{cc}
}

func (c *payloadServiceClient) GeneratePayload(ctx context.Context, in *PayloadGenerationRequest, opts ...grpc.CallOption) (*PayloadGenerationResult, error) {
	out := new(PayloadGenerationResult)
	err := c.cc.Invoke(ctx, "/chromite.api.PayloadService/GeneratePayload", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// PayloadServiceServer is the server API for PayloadService service.
type PayloadServiceServer interface {
	GeneratePayload(context.Context, *PayloadGenerationRequest) (*PayloadGenerationResult, error)
}

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

func (*UnimplementedPayloadServiceServer) GeneratePayload(ctx context.Context, req *PayloadGenerationRequest) (*PayloadGenerationResult, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GeneratePayload not implemented")
}

func RegisterPayloadServiceServer(s *grpc.Server, srv PayloadServiceServer) {
	s.RegisterService(&_PayloadService_serviceDesc, srv)
}

func _PayloadService_GeneratePayload_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(PayloadGenerationRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(PayloadServiceServer).GeneratePayload(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.PayloadService/GeneratePayload",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(PayloadServiceServer).GeneratePayload(ctx, req.(*PayloadGenerationRequest))
	}
	return interceptor(ctx, in, info, handler)
}

var _PayloadService_serviceDesc = grpc.ServiceDesc{
	ServiceName: "chromite.api.PayloadService",
	HandlerType: (*PayloadServiceServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "GeneratePayload",
			Handler:    _PayloadService_GeneratePayload_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "chromite/api/payload.proto",
}
