// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.25.0-devel
// 	protoc        v3.6.1
// source: chromite/api/firmware.proto

package api

import (
	chromiumos "go.chromium.org/chromiumos/infra/proto/go/chromiumos"
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
	reflect "reflect"
	sync "sync"
)

const (
	// Verify that this generated code is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
	// Verify that runtime/protoimpl is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)

// TODO(b/177907747): Drop this once the migration is complete.
// List of known location that firmware can be built from.
type FwLocation int32

const (
	FwLocation_FW_LOCATION_UNKNOWN FwLocation = 0
	FwLocation_PLATFORM_EC         FwLocation = 1 // platform/ec/firmware_builder.py
	FwLocation_PLATFORM_ZEPHYR     FwLocation = 2 // platform/zephyr-chrome/firmware_builder.py
	FwLocation_PLATFORM_TI50       FwLocation = 3 // platform/ti50/common/firmware_builder.py.  Added in R90.
)

// Enum value maps for FwLocation.
var (
	FwLocation_name = map[int32]string{
		0: "FW_LOCATION_UNKNOWN",
		1: "PLATFORM_EC",
		2: "PLATFORM_ZEPHYR",
		3: "PLATFORM_TI50",
	}
	FwLocation_value = map[string]int32{
		"FW_LOCATION_UNKNOWN": 0,
		"PLATFORM_EC":         1,
		"PLATFORM_ZEPHYR":     2,
		"PLATFORM_TI50":       3,
	}
)

func (x FwLocation) Enum() *FwLocation {
	p := new(FwLocation)
	*p = x
	return p
}

func (x FwLocation) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (FwLocation) Descriptor() protoreflect.EnumDescriptor {
	return file_chromite_api_firmware_proto_enumTypes[0].Descriptor()
}

func (FwLocation) Type() protoreflect.EnumType {
	return &file_chromite_api_firmware_proto_enumTypes[0]
}

func (x FwLocation) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use FwLocation.Descriptor instead.
func (FwLocation) EnumDescriptor() ([]byte, []int) {
	return file_chromite_api_firmware_proto_rawDescGZIP(), []int{0}
}

type FwBuildMetric_FwSection_FwRegion int32

const (
	FwBuildMetric_FwSection_FW_REGION_UNKNOWN FwBuildMetric_FwSection_FwRegion = 0
	FwBuildMetric_FwSection_EC_RO             FwBuildMetric_FwSection_FwRegion = 1 // The entire section protected by write protect.
	FwBuildMetric_FwSection_EC_RW             FwBuildMetric_FwSection_FwRegion = 2 // Also RW_A for EFS1 systems.
	FwBuildMetric_FwSection_EC_RO_BSS         FwBuildMetric_FwSection_FwRegion = 3
	FwBuildMetric_FwSection_EC_RW_BSS         FwBuildMetric_FwSection_FwRegion = 4
	FwBuildMetric_FwSection_EC_SHARED_MEM     FwBuildMetric_FwSection_FwRegion = 5
)

// Enum value maps for FwBuildMetric_FwSection_FwRegion.
var (
	FwBuildMetric_FwSection_FwRegion_name = map[int32]string{
		0: "FW_REGION_UNKNOWN",
		1: "EC_RO",
		2: "EC_RW",
		3: "EC_RO_BSS",
		4: "EC_RW_BSS",
		5: "EC_SHARED_MEM",
	}
	FwBuildMetric_FwSection_FwRegion_value = map[string]int32{
		"FW_REGION_UNKNOWN": 0,
		"EC_RO":             1,
		"EC_RW":             2,
		"EC_RO_BSS":         3,
		"EC_RW_BSS":         4,
		"EC_SHARED_MEM":     5,
	}
)

func (x FwBuildMetric_FwSection_FwRegion) Enum() *FwBuildMetric_FwSection_FwRegion {
	p := new(FwBuildMetric_FwSection_FwRegion)
	*p = x
	return p
}

func (x FwBuildMetric_FwSection_FwRegion) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (FwBuildMetric_FwSection_FwRegion) Descriptor() protoreflect.EnumDescriptor {
	return file_chromite_api_firmware_proto_enumTypes[1].Descriptor()
}

func (FwBuildMetric_FwSection_FwRegion) Type() protoreflect.EnumType {
	return &file_chromite_api_firmware_proto_enumTypes[1]
}

func (x FwBuildMetric_FwSection_FwRegion) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use FwBuildMetric_FwSection_FwRegion.Descriptor instead.
func (FwBuildMetric_FwSection_FwRegion) EnumDescriptor() ([]byte, []int) {
	return file_chromite_api_firmware_proto_rawDescGZIP(), []int{2, 0, 0}
}

type FirmwareArtifactInfo_TarballInfo_FirmwareType_Type int32

const (
	FirmwareArtifactInfo_TarballInfo_FirmwareType_UNKNOWN FirmwareArtifactInfo_TarballInfo_FirmwareType_Type = 0
	FirmwareArtifactInfo_TarballInfo_FirmwareType_MAIN    FirmwareArtifactInfo_TarballInfo_FirmwareType_Type = 1
	FirmwareArtifactInfo_TarballInfo_FirmwareType_EC      FirmwareArtifactInfo_TarballInfo_FirmwareType_Type = 2
	FirmwareArtifactInfo_TarballInfo_FirmwareType_PD      FirmwareArtifactInfo_TarballInfo_FirmwareType_Type = 3
)

// Enum value maps for FirmwareArtifactInfo_TarballInfo_FirmwareType_Type.
var (
	FirmwareArtifactInfo_TarballInfo_FirmwareType_Type_name = map[int32]string{
		0: "UNKNOWN",
		1: "MAIN",
		2: "EC",
		3: "PD",
	}
	FirmwareArtifactInfo_TarballInfo_FirmwareType_Type_value = map[string]int32{
		"UNKNOWN": 0,
		"MAIN":    1,
		"EC":      2,
		"PD":      3,
	}
)

func (x FirmwareArtifactInfo_TarballInfo_FirmwareType_Type) Enum() *FirmwareArtifactInfo_TarballInfo_FirmwareType_Type {
	p := new(FirmwareArtifactInfo_TarballInfo_FirmwareType_Type)
	*p = x
	return p
}

func (x FirmwareArtifactInfo_TarballInfo_FirmwareType_Type) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (FirmwareArtifactInfo_TarballInfo_FirmwareType_Type) Descriptor() protoreflect.EnumDescriptor {
	return file_chromite_api_firmware_proto_enumTypes[2].Descriptor()
}

func (FirmwareArtifactInfo_TarballInfo_FirmwareType_Type) Type() protoreflect.EnumType {
	return &file_chromite_api_firmware_proto_enumTypes[2]
}

func (x FirmwareArtifactInfo_TarballInfo_FirmwareType_Type) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use FirmwareArtifactInfo_TarballInfo_FirmwareType_Type.Descriptor instead.
func (FirmwareArtifactInfo_TarballInfo_FirmwareType_Type) EnumDescriptor() ([]byte, []int) {
	return file_chromite_api_firmware_proto_rawDescGZIP(), []int{16, 0, 0, 0}
}

// Added in R91.
type BcsVersionInfo struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Chrome OS version string, such as "R91-13844.0.0-45436".
	VersionString string `protobuf:"bytes,1,opt,name=version_string,json=versionString,proto3" json:"version_string,omitempty"`
}

func (x *BcsVersionInfo) Reset() {
	*x = BcsVersionInfo{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_firmware_proto_msgTypes[0]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *BcsVersionInfo) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*BcsVersionInfo) ProtoMessage() {}

func (x *BcsVersionInfo) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_firmware_proto_msgTypes[0]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use BcsVersionInfo.ProtoReflect.Descriptor instead.
func (*BcsVersionInfo) Descriptor() ([]byte, []int) {
	return file_chromite_api_firmware_proto_rawDescGZIP(), []int{0}
}

func (x *BcsVersionInfo) GetVersionString() string {
	if x != nil {
		return x.VersionString
	}
	return ""
}

// Added in R91.
type FirmwareVersionInfo struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Firmware version string, such as "atlas_v2.0.923-84a1d7260".
	VersionString string `protobuf:"bytes,1,opt,name=version_string,json=versionString,proto3" json:"version_string,omitempty"` // Extend with fields that break down the version string.
}

func (x *FirmwareVersionInfo) Reset() {
	*x = FirmwareVersionInfo{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_firmware_proto_msgTypes[1]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *FirmwareVersionInfo) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*FirmwareVersionInfo) ProtoMessage() {}

func (x *FirmwareVersionInfo) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_firmware_proto_msgTypes[1]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use FirmwareVersionInfo.ProtoReflect.Descriptor instead.
func (*FirmwareVersionInfo) Descriptor() ([]byte, []int) {
	return file_chromite_api_firmware_proto_rawDescGZIP(), []int{1}
}

func (x *FirmwareVersionInfo) GetVersionString() string {
	if x != nil {
		return x.VersionString
	}
	return ""
}

// Metrics collected on every successful firmware build.
type FwBuildMetric struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Lowercase name of the firmware target built. E.g. phaser.
	TargetName string `protobuf:"bytes,1,opt,name=target_name,json=targetName,proto3" json:"target_name,omitempty"`
	// Lowercase name of the platform the firmware target belongs to. May be
	// blank. E.g. octopus.
	PlatformName string `protobuf:"bytes,2,opt,name=platform_name,json=platformName,proto3" json:"platform_name,omitempty"`
	// List of firmware sections and their free and total sizes in bytes.
	FwSection []*FwBuildMetric_FwSection `protobuf:"bytes,3,rep,name=fw_section,json=fwSection,proto3" json:"fw_section,omitempty"`
	// Optional information related to a specific target type.
	//
	// Types that are assignable to ImageType:
	//	*FwBuildMetric_Zephyr
	ImageType isFwBuildMetric_ImageType `protobuf_oneof:"image_type"`
}

func (x *FwBuildMetric) Reset() {
	*x = FwBuildMetric{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_firmware_proto_msgTypes[2]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *FwBuildMetric) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*FwBuildMetric) ProtoMessage() {}

func (x *FwBuildMetric) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_firmware_proto_msgTypes[2]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use FwBuildMetric.ProtoReflect.Descriptor instead.
func (*FwBuildMetric) Descriptor() ([]byte, []int) {
	return file_chromite_api_firmware_proto_rawDescGZIP(), []int{2}
}

func (x *FwBuildMetric) GetTargetName() string {
	if x != nil {
		return x.TargetName
	}
	return ""
}

func (x *FwBuildMetric) GetPlatformName() string {
	if x != nil {
		return x.PlatformName
	}
	return ""
}

func (x *FwBuildMetric) GetFwSection() []*FwBuildMetric_FwSection {
	if x != nil {
		return x.FwSection
	}
	return nil
}

func (m *FwBuildMetric) GetImageType() isFwBuildMetric_ImageType {
	if m != nil {
		return m.ImageType
	}
	return nil
}

func (x *FwBuildMetric) GetZephyr() *FwBuildMetric_ZephyrTarget {
	if x, ok := x.GetImageType().(*FwBuildMetric_Zephyr); ok {
		return x.Zephyr
	}
	return nil
}

type isFwBuildMetric_ImageType interface {
	isFwBuildMetric_ImageType()
}

type FwBuildMetric_Zephyr struct {
	Zephyr *FwBuildMetric_ZephyrTarget `protobuf:"bytes,4,opt,name=zephyr,proto3,oneof"`
}

func (*FwBuildMetric_Zephyr) isFwBuildMetric_ImageType() {}

// A list of FW metrics collected on every successful firmware build
// Implementation note, this is a separate message since it serves as the
// serialization base between the build_api end point and the entry point
// in the firmware_builder.py.
type FwBuildMetricList struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Value []*FwBuildMetric `protobuf:"bytes,1,rep,name=value,proto3" json:"value,omitempty"`
}

func (x *FwBuildMetricList) Reset() {
	*x = FwBuildMetricList{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_firmware_proto_msgTypes[3]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *FwBuildMetricList) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*FwBuildMetricList) ProtoMessage() {}

func (x *FwBuildMetricList) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_firmware_proto_msgTypes[3]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use FwBuildMetricList.ProtoReflect.Descriptor instead.
func (*FwBuildMetricList) Descriptor() ([]byte, []int) {
	return file_chromite_api_firmware_proto_rawDescGZIP(), []int{3}
}

func (x *FwBuildMetricList) GetValue() []*FwBuildMetric {
	if x != nil {
		return x.Value
	}
	return nil
}

// Metrics collect on successful firmware unit test runs.
type FwTestMetric struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Name of firmware test.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
}

func (x *FwTestMetric) Reset() {
	*x = FwTestMetric{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_firmware_proto_msgTypes[4]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *FwTestMetric) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*FwTestMetric) ProtoMessage() {}

func (x *FwTestMetric) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_firmware_proto_msgTypes[4]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use FwTestMetric.ProtoReflect.Descriptor instead.
func (*FwTestMetric) Descriptor() ([]byte, []int) {
	return file_chromite_api_firmware_proto_rawDescGZIP(), []int{4}
}

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

// A list of FW metrics collected on every successful firmware unit test.
// Implementation note, this is a separate message since it serves as the
// serialization base between the build_api end point and the entry point
// in the firmware_builder.py.
type FwTestMetricList struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Value []*FwTestMetric `protobuf:"bytes,1,rep,name=value,proto3" json:"value,omitempty"`
}

func (x *FwTestMetricList) Reset() {
	*x = FwTestMetricList{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_firmware_proto_msgTypes[5]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *FwTestMetricList) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*FwTestMetricList) ProtoMessage() {}

func (x *FwTestMetricList) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_firmware_proto_msgTypes[5]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use FwTestMetricList.ProtoReflect.Descriptor instead.
func (*FwTestMetricList) Descriptor() ([]byte, []int) {
	return file_chromite_api_firmware_proto_rawDescGZIP(), []int{5}
}

func (x *FwTestMetricList) GetValue() []*FwTestMetric {
	if x != nil {
		return x.Value
	}
	return nil
}

// TODO(b/177907747): Drop this once the migration is complete.
type BuildAllTotFirmwareRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Location of firmware to build call into firmware_builder.py entry point.
	// The `build` subcommand will be called.
	FirmwareLocation FwLocation `protobuf:"varint,1,opt,name=firmware_location,json=firmwareLocation,proto3,enum=chromite.api.FwLocation" json:"firmware_location,omitempty"`
	// The chroot where the operations will be executed.
	// Required.
	Chroot *chromiumos.Chroot `protobuf:"bytes,2,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// Whether to pass --code-coverage to firmware_builder.py.
	CodeCoverage bool `protobuf:"varint,3,opt,name=code_coverage,json=codeCoverage,proto3" json:"code_coverage,omitempty"`
}

func (x *BuildAllTotFirmwareRequest) Reset() {
	*x = BuildAllTotFirmwareRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_firmware_proto_msgTypes[6]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *BuildAllTotFirmwareRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*BuildAllTotFirmwareRequest) ProtoMessage() {}

func (x *BuildAllTotFirmwareRequest) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_firmware_proto_msgTypes[6]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use BuildAllTotFirmwareRequest.ProtoReflect.Descriptor instead.
func (*BuildAllTotFirmwareRequest) Descriptor() ([]byte, []int) {
	return file_chromite_api_firmware_proto_rawDescGZIP(), []int{6}
}

func (x *BuildAllTotFirmwareRequest) GetFirmwareLocation() FwLocation {
	if x != nil {
		return x.FirmwareLocation
	}
	return FwLocation_FW_LOCATION_UNKNOWN
}

func (x *BuildAllTotFirmwareRequest) GetChroot() *chromiumos.Chroot {
	if x != nil {
		return x.Chroot
	}
	return nil
}

func (x *BuildAllTotFirmwareRequest) GetCodeCoverage() bool {
	if x != nil {
		return x.CodeCoverage
	}
	return false
}

// TODO(b/177907747): Drop this once the migration is complete.
type BuildAllTotFirmwareResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Metrics collected on every successful firmware build
	Metrics *FwBuildMetricList `protobuf:"bytes,1,opt,name=metrics,proto3" json:"metrics,omitempty"`
}

func (x *BuildAllTotFirmwareResponse) Reset() {
	*x = BuildAllTotFirmwareResponse{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_firmware_proto_msgTypes[7]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *BuildAllTotFirmwareResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*BuildAllTotFirmwareResponse) ProtoMessage() {}

func (x *BuildAllTotFirmwareResponse) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_firmware_proto_msgTypes[7]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use BuildAllTotFirmwareResponse.ProtoReflect.Descriptor instead.
func (*BuildAllTotFirmwareResponse) Descriptor() ([]byte, []int) {
	return file_chromite_api_firmware_proto_rawDescGZIP(), []int{7}
}

func (x *BuildAllTotFirmwareResponse) GetMetrics() *FwBuildMetricList {
	if x != nil {
		return x.Metrics
	}
	return nil
}

// TODO(b/177907747): Drop this once the migration is complete.
type TestAllTotFirmwareRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Location of firmware to build call into firmware_builder.py entry point.
	// The `test` subcommand will be called
	FirmwareLocation FwLocation `protobuf:"varint,1,opt,name=firmware_location,json=firmwareLocation,proto3,enum=chromite.api.FwLocation" json:"firmware_location,omitempty"`
	// The chroot where the operations will be executed.
	// Required.
	Chroot *chromiumos.Chroot `protobuf:"bytes,2,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// Whether to pass --code-coverage to firmware_builder.py.
	CodeCoverage bool `protobuf:"varint,3,opt,name=code_coverage,json=codeCoverage,proto3" json:"code_coverage,omitempty"`
}

func (x *TestAllTotFirmwareRequest) Reset() {
	*x = TestAllTotFirmwareRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_firmware_proto_msgTypes[8]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *TestAllTotFirmwareRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*TestAllTotFirmwareRequest) ProtoMessage() {}

func (x *TestAllTotFirmwareRequest) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_firmware_proto_msgTypes[8]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use TestAllTotFirmwareRequest.ProtoReflect.Descriptor instead.
func (*TestAllTotFirmwareRequest) Descriptor() ([]byte, []int) {
	return file_chromite_api_firmware_proto_rawDescGZIP(), []int{8}
}

func (x *TestAllTotFirmwareRequest) GetFirmwareLocation() FwLocation {
	if x != nil {
		return x.FirmwareLocation
	}
	return FwLocation_FW_LOCATION_UNKNOWN
}

func (x *TestAllTotFirmwareRequest) GetChroot() *chromiumos.Chroot {
	if x != nil {
		return x.Chroot
	}
	return nil
}

func (x *TestAllTotFirmwareRequest) GetCodeCoverage() bool {
	if x != nil {
		return x.CodeCoverage
	}
	return false
}

// TODO(b/177907747): Drop this once the migration is complete.
type TestAllTotFirmwareResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Metrics collect on successfuly firmware unit test runs
	Metrics *FwTestMetricList `protobuf:"bytes,1,opt,name=metrics,proto3" json:"metrics,omitempty"`
}

func (x *TestAllTotFirmwareResponse) Reset() {
	*x = TestAllTotFirmwareResponse{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_firmware_proto_msgTypes[9]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *TestAllTotFirmwareResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*TestAllTotFirmwareResponse) ProtoMessage() {}

func (x *TestAllTotFirmwareResponse) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_firmware_proto_msgTypes[9]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use TestAllTotFirmwareResponse.ProtoReflect.Descriptor instead.
func (*TestAllTotFirmwareResponse) Descriptor() ([]byte, []int) {
	return file_chromite_api_firmware_proto_rawDescGZIP(), []int{9}
}

func (x *TestAllTotFirmwareResponse) GetMetrics() *FwTestMetricList {
	if x != nil {
		return x.Metrics
	}
	return nil
}

type BuildAllFirmwareRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Location of firmware to build call into firmware_builder.py entry point.
	// The `build` subcommand will be called
	FirmwareLocation chromiumos.FwLocation `protobuf:"varint,1,opt,name=firmware_location,json=firmwareLocation,proto3,enum=chromiumos.FwLocation" json:"firmware_location,omitempty"`
	// The chroot where the operations will be executed.
	// Required.
	Chroot *chromiumos.Chroot `protobuf:"bytes,2,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// Whether to pass --code-coverage to firmware_builder.py.
	CodeCoverage bool `protobuf:"varint,3,opt,name=code_coverage,json=codeCoverage,proto3" json:"code_coverage,omitempty"`
}

func (x *BuildAllFirmwareRequest) Reset() {
	*x = BuildAllFirmwareRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_firmware_proto_msgTypes[10]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *BuildAllFirmwareRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*BuildAllFirmwareRequest) ProtoMessage() {}

func (x *BuildAllFirmwareRequest) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_firmware_proto_msgTypes[10]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use BuildAllFirmwareRequest.ProtoReflect.Descriptor instead.
func (*BuildAllFirmwareRequest) Descriptor() ([]byte, []int) {
	return file_chromite_api_firmware_proto_rawDescGZIP(), []int{10}
}

func (x *BuildAllFirmwareRequest) GetFirmwareLocation() chromiumos.FwLocation {
	if x != nil {
		return x.FirmwareLocation
	}
	return chromiumos.FwLocation_FW_LOCATION_UNKNOWN
}

func (x *BuildAllFirmwareRequest) GetChroot() *chromiumos.Chroot {
	if x != nil {
		return x.Chroot
	}
	return nil
}

func (x *BuildAllFirmwareRequest) GetCodeCoverage() bool {
	if x != nil {
		return x.CodeCoverage
	}
	return false
}

type BuildAllFirmwareResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Metrics collected on every successful firmware build
	Metrics *FwBuildMetricList `protobuf:"bytes,1,opt,name=metrics,proto3" json:"metrics,omitempty"`
}

func (x *BuildAllFirmwareResponse) Reset() {
	*x = BuildAllFirmwareResponse{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_firmware_proto_msgTypes[11]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *BuildAllFirmwareResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*BuildAllFirmwareResponse) ProtoMessage() {}

func (x *BuildAllFirmwareResponse) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_firmware_proto_msgTypes[11]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use BuildAllFirmwareResponse.ProtoReflect.Descriptor instead.
func (*BuildAllFirmwareResponse) Descriptor() ([]byte, []int) {
	return file_chromite_api_firmware_proto_rawDescGZIP(), []int{11}
}

func (x *BuildAllFirmwareResponse) GetMetrics() *FwBuildMetricList {
	if x != nil {
		return x.Metrics
	}
	return nil
}

type TestAllFirmwareRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Location of firmware to build call into firmware_builder.py entry point.
	// The `test` subcommand will be called
	FirmwareLocation chromiumos.FwLocation `protobuf:"varint,1,opt,name=firmware_location,json=firmwareLocation,proto3,enum=chromiumos.FwLocation" json:"firmware_location,omitempty"`
	// The chroot where the operations will be executed.
	// Required.
	Chroot *chromiumos.Chroot `protobuf:"bytes,2,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// Whether to pass --code-coverage to firmware_builder.py.
	CodeCoverage bool `protobuf:"varint,3,opt,name=code_coverage,json=codeCoverage,proto3" json:"code_coverage,omitempty"`
}

func (x *TestAllFirmwareRequest) Reset() {
	*x = TestAllFirmwareRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_firmware_proto_msgTypes[12]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *TestAllFirmwareRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*TestAllFirmwareRequest) ProtoMessage() {}

func (x *TestAllFirmwareRequest) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_firmware_proto_msgTypes[12]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use TestAllFirmwareRequest.ProtoReflect.Descriptor instead.
func (*TestAllFirmwareRequest) Descriptor() ([]byte, []int) {
	return file_chromite_api_firmware_proto_rawDescGZIP(), []int{12}
}

func (x *TestAllFirmwareRequest) GetFirmwareLocation() chromiumos.FwLocation {
	if x != nil {
		return x.FirmwareLocation
	}
	return chromiumos.FwLocation_FW_LOCATION_UNKNOWN
}

func (x *TestAllFirmwareRequest) GetChroot() *chromiumos.Chroot {
	if x != nil {
		return x.Chroot
	}
	return nil
}

func (x *TestAllFirmwareRequest) GetCodeCoverage() bool {
	if x != nil {
		return x.CodeCoverage
	}
	return false
}

type TestAllFirmwareResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Metrics collect on successfuly firmware unit test runs
	Metrics *FwTestMetricList `protobuf:"bytes,1,opt,name=metrics,proto3" json:"metrics,omitempty"`
}

func (x *TestAllFirmwareResponse) Reset() {
	*x = TestAllFirmwareResponse{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_firmware_proto_msgTypes[13]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *TestAllFirmwareResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*TestAllFirmwareResponse) ProtoMessage() {}

func (x *TestAllFirmwareResponse) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_firmware_proto_msgTypes[13]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use TestAllFirmwareResponse.ProtoReflect.Descriptor instead.
func (*TestAllFirmwareResponse) Descriptor() ([]byte, []int) {
	return file_chromite_api_firmware_proto_rawDescGZIP(), []int{13}
}

func (x *TestAllFirmwareResponse) GetMetrics() *FwTestMetricList {
	if x != nil {
		return x.Metrics
	}
	return nil
}

type BundleFirmwareArtifactsRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The chroot where the operations will be executed.
	// Required.
	Chroot *chromiumos.Chroot `protobuf:"bytes,2,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// The output directory in which to place the bundled artifacts.
	ResultPath *chromiumos.ResultPath `protobuf:"bytes,3,opt,name=result_path,json=resultPath,proto3" json:"result_path,omitempty"`
	// The artifact types requested.  The firmware_location is found in
	// artifacts.output_artifacts[].location.
	Artifacts *chromiumos.ArtifactsByService_Firmware `protobuf:"bytes,4,opt,name=artifacts,proto3" json:"artifacts,omitempty"`
	// The Chrome OS style version to use in FirmwareArtifactInfo.
	// Added and deprecated in R91.
	//
	// Deprecated: Do not use.
	BcsVersion string `protobuf:"bytes,5,opt,name=bcs_version,json=bcsVersion,proto3" json:"bcs_version,omitempty"`
	// BcsVersionInfo to use in (copy into) FirmwareArtifactInfo.TarballInfo.
	BcsVersionInfo *BcsVersionInfo `protobuf:"bytes,6,opt,name=bcs_version_info,json=bcsVersionInfo,proto3" json:"bcs_version_info,omitempty"`
}

func (x *BundleFirmwareArtifactsRequest) Reset() {
	*x = BundleFirmwareArtifactsRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_firmware_proto_msgTypes[14]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *BundleFirmwareArtifactsRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*BundleFirmwareArtifactsRequest) ProtoMessage() {}

func (x *BundleFirmwareArtifactsRequest) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_firmware_proto_msgTypes[14]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use BundleFirmwareArtifactsRequest.ProtoReflect.Descriptor instead.
func (*BundleFirmwareArtifactsRequest) Descriptor() ([]byte, []int) {
	return file_chromite_api_firmware_proto_rawDescGZIP(), []int{14}
}

func (x *BundleFirmwareArtifactsRequest) GetChroot() *chromiumos.Chroot {
	if x != nil {
		return x.Chroot
	}
	return nil
}

func (x *BundleFirmwareArtifactsRequest) GetResultPath() *chromiumos.ResultPath {
	if x != nil {
		return x.ResultPath
	}
	return nil
}

func (x *BundleFirmwareArtifactsRequest) GetArtifacts() *chromiumos.ArtifactsByService_Firmware {
	if x != nil {
		return x.Artifacts
	}
	return nil
}

// Deprecated: Do not use.
func (x *BundleFirmwareArtifactsRequest) GetBcsVersion() string {
	if x != nil {
		return x.BcsVersion
	}
	return ""
}

func (x *BundleFirmwareArtifactsRequest) GetBcsVersionInfo() *BcsVersionInfo {
	if x != nil {
		return x.BcsVersionInfo
	}
	return nil
}

type BundleFirmwareArtifactsResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The artifacts that were bundled.
	Artifacts *chromiumos.UploadedArtifactsByService_Firmware `protobuf:"bytes,1,opt,name=artifacts,proto3" json:"artifacts,omitempty"`
}

func (x *BundleFirmwareArtifactsResponse) Reset() {
	*x = BundleFirmwareArtifactsResponse{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_firmware_proto_msgTypes[15]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *BundleFirmwareArtifactsResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*BundleFirmwareArtifactsResponse) ProtoMessage() {}

func (x *BundleFirmwareArtifactsResponse) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_firmware_proto_msgTypes[15]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use BundleFirmwareArtifactsResponse.ProtoReflect.Descriptor instead.
func (*BundleFirmwareArtifactsResponse) Descriptor() ([]byte, []int) {
	return file_chromite_api_firmware_proto_rawDescGZIP(), []int{15}
}

func (x *BundleFirmwareArtifactsResponse) GetArtifacts() *chromiumos.UploadedArtifactsByService_Firmware {
	if x != nil {
		return x.Artifacts
	}
	return nil
}

// Contents of a Firmware.FIRMWARE_TARBALL_INFO artifact.
type FirmwareArtifactInfo struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Objects []*FirmwareArtifactInfo_ObjectInfo `protobuf:"bytes,1,rep,name=objects,proto3" json:"objects,omitempty"`
	// The value provided by BundleFirmwareArtifactsRequest, this is the version
	// of Chrome OS used for this build.
	// Added in R91.
	BcsVersionInfo *BcsVersionInfo `protobuf:"bytes,2,opt,name=bcs_version_info,json=bcsVersionInfo,proto3" json:"bcs_version_info,omitempty"`
}

func (x *FirmwareArtifactInfo) Reset() {
	*x = FirmwareArtifactInfo{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_firmware_proto_msgTypes[16]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *FirmwareArtifactInfo) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*FirmwareArtifactInfo) ProtoMessage() {}

func (x *FirmwareArtifactInfo) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_firmware_proto_msgTypes[16]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use FirmwareArtifactInfo.ProtoReflect.Descriptor instead.
func (*FirmwareArtifactInfo) Descriptor() ([]byte, []int) {
	return file_chromite_api_firmware_proto_rawDescGZIP(), []int{16}
}

func (x *FirmwareArtifactInfo) GetObjects() []*FirmwareArtifactInfo_ObjectInfo {
	if x != nil {
		return x.Objects
	}
	return nil
}

func (x *FirmwareArtifactInfo) GetBcsVersionInfo() *BcsVersionInfo {
	if x != nil {
		return x.BcsVersionInfo
	}
	return nil
}

type FwBuildMetric_FwSection struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Region as described in FMAP or linker script.
	// E.g. EC_RO, EC_RW, EC_NVRAM, RO_BSS, RW_BSS, SHARED_MEM.
	Region FwBuildMetric_FwSection_FwRegion `protobuf:"varint,1,opt,name=region,proto3,enum=chromite.api.FwBuildMetric_FwSection_FwRegion" json:"region,omitempty"`
	// The number of bytes used in this section.
	Used uint32 `protobuf:"varint,2,opt,name=used,proto3" json:"used,omitempty"`
	// The total number of bytes available in this section.
	Total uint32 `protobuf:"varint,3,opt,name=total,proto3" json:"total,omitempty"`
}

func (x *FwBuildMetric_FwSection) Reset() {
	*x = FwBuildMetric_FwSection{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_firmware_proto_msgTypes[17]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *FwBuildMetric_FwSection) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*FwBuildMetric_FwSection) ProtoMessage() {}

func (x *FwBuildMetric_FwSection) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_firmware_proto_msgTypes[17]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use FwBuildMetric_FwSection.ProtoReflect.Descriptor instead.
func (*FwBuildMetric_FwSection) Descriptor() ([]byte, []int) {
	return file_chromite_api_firmware_proto_rawDescGZIP(), []int{2, 0}
}

func (x *FwBuildMetric_FwSection) GetRegion() FwBuildMetric_FwSection_FwRegion {
	if x != nil {
		return x.Region
	}
	return FwBuildMetric_FwSection_FW_REGION_UNKNOWN
}

func (x *FwBuildMetric_FwSection) GetUsed() uint32 {
	if x != nil {
		return x.Used
	}
	return 0
}

func (x *FwBuildMetric_FwSection) GetTotal() uint32 {
	if x != nil {
		return x.Total
	}
	return 0
}

// Version number components: "major.minor.tiny".
type FwBuildMetric_Version struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Major uint32 `protobuf:"varint,1,opt,name=major,proto3" json:"major,omitempty"`
	Minor uint32 `protobuf:"varint,2,opt,name=minor,proto3" json:"minor,omitempty"`
	Tiny  uint32 `protobuf:"varint,3,opt,name=tiny,proto3" json:"tiny,omitempty"`
}

func (x *FwBuildMetric_Version) Reset() {
	*x = FwBuildMetric_Version{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_firmware_proto_msgTypes[18]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *FwBuildMetric_Version) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*FwBuildMetric_Version) ProtoMessage() {}

func (x *FwBuildMetric_Version) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_firmware_proto_msgTypes[18]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use FwBuildMetric_Version.ProtoReflect.Descriptor instead.
func (*FwBuildMetric_Version) Descriptor() ([]byte, []int) {
	return file_chromite_api_firmware_proto_rawDescGZIP(), []int{2, 1}
}

func (x *FwBuildMetric_Version) GetMajor() uint32 {
	if x != nil {
		return x.Major
	}
	return 0
}

func (x *FwBuildMetric_Version) GetMinor() uint32 {
	if x != nil {
		return x.Minor
	}
	return 0
}

func (x *FwBuildMetric_Version) GetTiny() uint32 {
	if x != nil {
		return x.Tiny
	}
	return 0
}

// Zephyr-base firmware target related build metrics.
type FwBuildMetric_ZephyrTarget struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The version of the Zephyr kernel used during build.
	KernelVersion *FwBuildMetric_Version `protobuf:"bytes,1,opt,name=kernel_version,json=kernelVersion,proto3" json:"kernel_version,omitempty"`
}

func (x *FwBuildMetric_ZephyrTarget) Reset() {
	*x = FwBuildMetric_ZephyrTarget{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_firmware_proto_msgTypes[19]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *FwBuildMetric_ZephyrTarget) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*FwBuildMetric_ZephyrTarget) ProtoMessage() {}

func (x *FwBuildMetric_ZephyrTarget) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_firmware_proto_msgTypes[19]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use FwBuildMetric_ZephyrTarget.ProtoReflect.Descriptor instead.
func (*FwBuildMetric_ZephyrTarget) Descriptor() ([]byte, []int) {
	return file_chromite_api_firmware_proto_rawDescGZIP(), []int{2, 2}
}

func (x *FwBuildMetric_ZephyrTarget) GetKernelVersion() *FwBuildMetric_Version {
	if x != nil {
		return x.KernelVersion
	}
	return nil
}

// TODO(crbug/1176305): Use types from
// chromiumos/config/api/software/firmware_config.proto
type FirmwareArtifactInfo_TarballInfo struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The Chrome OS style version.
	// Use bcs_version_info.version_string instead.
	// Deprecated since R91.
	//
	// Deprecated: Do not use.
	BcsVersion string `protobuf:"bytes,1,opt,name=bcs_version,json=bcsVersion,proto3" json:"bcs_version,omitempty"`
	// The name of the firmware image used by the firmware updater. Typically
	// the device name, but can differ when a device may have two or more
	// different firmware images.
	FirmwareImageName string                                             `protobuf:"bytes,2,opt,name=firmware_image_name,json=firmwareImageName,proto3" json:"firmware_image_name,omitempty"`
	Type              FirmwareArtifactInfo_TarballInfo_FirmwareType_Type `protobuf:"varint,3,opt,name=type,proto3,enum=chromite.api.FirmwareArtifactInfo_TarballInfo_FirmwareType_Type" json:"type,omitempty"`
	// Use firmware_version_info instead.
	// Deprecated since R91.
	//
	// Deprecated: Do not use.
	Version *FirmwareArtifactInfo_TarballInfo_Version `protobuf:"bytes,4,opt,name=version,proto3" json:"version,omitempty"`
	// Added in R91.  Required.
	FirmwareVersionInfo *FirmwareVersionInfo `protobuf:"bytes,5,opt,name=firmware_version_info,json=firmwareVersionInfo,proto3" json:"firmware_version_info,omitempty"`
}

func (x *FirmwareArtifactInfo_TarballInfo) Reset() {
	*x = FirmwareArtifactInfo_TarballInfo{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_firmware_proto_msgTypes[20]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *FirmwareArtifactInfo_TarballInfo) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*FirmwareArtifactInfo_TarballInfo) ProtoMessage() {}

func (x *FirmwareArtifactInfo_TarballInfo) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_firmware_proto_msgTypes[20]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use FirmwareArtifactInfo_TarballInfo.ProtoReflect.Descriptor instead.
func (*FirmwareArtifactInfo_TarballInfo) Descriptor() ([]byte, []int) {
	return file_chromite_api_firmware_proto_rawDescGZIP(), []int{16, 0}
}

// Deprecated: Do not use.
func (x *FirmwareArtifactInfo_TarballInfo) GetBcsVersion() string {
	if x != nil {
		return x.BcsVersion
	}
	return ""
}

func (x *FirmwareArtifactInfo_TarballInfo) GetFirmwareImageName() string {
	if x != nil {
		return x.FirmwareImageName
	}
	return ""
}

func (x *FirmwareArtifactInfo_TarballInfo) GetType() FirmwareArtifactInfo_TarballInfo_FirmwareType_Type {
	if x != nil {
		return x.Type
	}
	return FirmwareArtifactInfo_TarballInfo_FirmwareType_UNKNOWN
}

// Deprecated: Do not use.
func (x *FirmwareArtifactInfo_TarballInfo) GetVersion() *FirmwareArtifactInfo_TarballInfo_Version {
	if x != nil {
		return x.Version
	}
	return nil
}

func (x *FirmwareArtifactInfo_TarballInfo) GetFirmwareVersionInfo() *FirmwareVersionInfo {
	if x != nil {
		return x.FirmwareVersionInfo
	}
	return nil
}

type FirmwareArtifactInfo_ObjectInfo struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The name of the file.
	FileName string `protobuf:"bytes,1,opt,name=file_name,json=fileName,proto3" json:"file_name,omitempty"`
	// Types that are assignable to FirmwareObjectInfo:
	//	*FirmwareArtifactInfo_ObjectInfo_TarballInfo
	FirmwareObjectInfo isFirmwareArtifactInfo_ObjectInfo_FirmwareObjectInfo `protobuf_oneof:"firmware_object_info"`
}

func (x *FirmwareArtifactInfo_ObjectInfo) Reset() {
	*x = FirmwareArtifactInfo_ObjectInfo{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_firmware_proto_msgTypes[21]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *FirmwareArtifactInfo_ObjectInfo) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*FirmwareArtifactInfo_ObjectInfo) ProtoMessage() {}

func (x *FirmwareArtifactInfo_ObjectInfo) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_firmware_proto_msgTypes[21]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use FirmwareArtifactInfo_ObjectInfo.ProtoReflect.Descriptor instead.
func (*FirmwareArtifactInfo_ObjectInfo) Descriptor() ([]byte, []int) {
	return file_chromite_api_firmware_proto_rawDescGZIP(), []int{16, 1}
}

func (x *FirmwareArtifactInfo_ObjectInfo) GetFileName() string {
	if x != nil {
		return x.FileName
	}
	return ""
}

func (m *FirmwareArtifactInfo_ObjectInfo) GetFirmwareObjectInfo() isFirmwareArtifactInfo_ObjectInfo_FirmwareObjectInfo {
	if m != nil {
		return m.FirmwareObjectInfo
	}
	return nil
}

func (x *FirmwareArtifactInfo_ObjectInfo) GetTarballInfo() *FirmwareArtifactInfo_TarballInfo {
	if x, ok := x.GetFirmwareObjectInfo().(*FirmwareArtifactInfo_ObjectInfo_TarballInfo); ok {
		return x.TarballInfo
	}
	return nil
}

type isFirmwareArtifactInfo_ObjectInfo_FirmwareObjectInfo interface {
	isFirmwareArtifactInfo_ObjectInfo_FirmwareObjectInfo()
}

type FirmwareArtifactInfo_ObjectInfo_TarballInfo struct {
	// Info about Firmware.FIRMWARE_TARBALL.
	TarballInfo *FirmwareArtifactInfo_TarballInfo `protobuf:"bytes,2,opt,name=tarball_info,json=tarballInfo,proto3,oneof"`
}

func (*FirmwareArtifactInfo_ObjectInfo_TarballInfo) isFirmwareArtifactInfo_ObjectInfo_FirmwareObjectInfo() {
}

// The type of a firmware binary.
type FirmwareArtifactInfo_TarballInfo_FirmwareType struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

func (x *FirmwareArtifactInfo_TarballInfo_FirmwareType) Reset() {
	*x = FirmwareArtifactInfo_TarballInfo_FirmwareType{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_firmware_proto_msgTypes[22]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *FirmwareArtifactInfo_TarballInfo_FirmwareType) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*FirmwareArtifactInfo_TarballInfo_FirmwareType) ProtoMessage() {}

func (x *FirmwareArtifactInfo_TarballInfo_FirmwareType) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_firmware_proto_msgTypes[22]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use FirmwareArtifactInfo_TarballInfo_FirmwareType.ProtoReflect.Descriptor instead.
func (*FirmwareArtifactInfo_TarballInfo_FirmwareType) Descriptor() ([]byte, []int) {
	return file_chromite_api_firmware_proto_rawDescGZIP(), []int{16, 0, 0}
}

// The firmware version from updater.sh --manifest.
type FirmwareArtifactInfo_TarballInfo_Version struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Major int32 `protobuf:"varint,1,opt,name=major,proto3" json:"major,omitempty"`
	Minor int32 `protobuf:"varint,2,opt,name=minor,proto3" json:"minor,omitempty"`
}

func (x *FirmwareArtifactInfo_TarballInfo_Version) Reset() {
	*x = FirmwareArtifactInfo_TarballInfo_Version{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromite_api_firmware_proto_msgTypes[23]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *FirmwareArtifactInfo_TarballInfo_Version) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*FirmwareArtifactInfo_TarballInfo_Version) ProtoMessage() {}

func (x *FirmwareArtifactInfo_TarballInfo_Version) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_firmware_proto_msgTypes[23]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use FirmwareArtifactInfo_TarballInfo_Version.ProtoReflect.Descriptor instead.
func (*FirmwareArtifactInfo_TarballInfo_Version) Descriptor() ([]byte, []int) {
	return file_chromite_api_firmware_proto_rawDescGZIP(), []int{16, 0, 1}
}

func (x *FirmwareArtifactInfo_TarballInfo_Version) GetMajor() int32 {
	if x != nil {
		return x.Major
	}
	return 0
}

func (x *FirmwareArtifactInfo_TarballInfo_Version) GetMinor() int32 {
	if x != nil {
		return x.Minor
	}
	return 0
}

var File_chromite_api_firmware_proto protoreflect.FileDescriptor

var file_chromite_api_firmware_proto_rawDesc = []byte{
	0x0a, 0x1b, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66,
	0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 0x63,
	0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x1a, 0x1c, 0x63, 0x68, 0x72,
	0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f,
	0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x63, 0x68, 0x72, 0x6f, 0x6d,
	0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f,
	0x74, 0x6f, 0x22, 0x37, 0x0a, 0x0e, 0x42, 0x63, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e,
	0x49, 0x6e, 0x66, 0x6f, 0x12, 0x25, 0x0a, 0x0e, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f,
	0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x76, 0x65,
	0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x3c, 0x0a, 0x13, 0x46,
	0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x6e,
	0x66, 0x6f, 0x12, 0x25, 0x0a, 0x0e, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74,
	0x72, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x76, 0x65, 0x72, 0x73,
	0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0xfe, 0x04, 0x0a, 0x0d, 0x46, 0x77,
	0x42, 0x75, 0x69, 0x6c, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x12, 0x1f, 0x0a, 0x0b, 0x74,
	0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
	0x52, 0x0a, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d,
	0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20,
	0x01, 0x28, 0x09, 0x52, 0x0c, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x4e, 0x61, 0x6d,
	0x65, 0x12, 0x44, 0x0a, 0x0a, 0x66, 0x77, 0x5f, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18,
	0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65,
	0x2e, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x77, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x4d, 0x65, 0x74, 0x72,
	0x69, 0x63, 0x2e, 0x46, 0x77, 0x53, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x66, 0x77,
	0x53, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x42, 0x0a, 0x06, 0x7a, 0x65, 0x70, 0x68, 0x79,
	0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69,
	0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x77, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x4d, 0x65,
	0x74, 0x72, 0x69, 0x63, 0x2e, 0x5a, 0x65, 0x70, 0x68, 0x79, 0x72, 0x54, 0x61, 0x72, 0x67, 0x65,
	0x74, 0x48, 0x00, 0x52, 0x06, 0x7a, 0x65, 0x70, 0x68, 0x79, 0x72, 0x1a, 0xe7, 0x01, 0x0a, 0x09,
	0x46, 0x77, 0x53, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x46, 0x0a, 0x06, 0x72, 0x65, 0x67,
	0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2e, 0x2e, 0x63, 0x68, 0x72, 0x6f,
	0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x77, 0x42, 0x75, 0x69, 0x6c, 0x64,
	0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x2e, 0x46, 0x77, 0x53, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e,
	0x2e, 0x46, 0x77, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f,
	0x6e, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52,
	0x04, 0x75, 0x73, 0x65, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x03,
	0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x68, 0x0a, 0x08, 0x46,
	0x77, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x15, 0x0a, 0x11, 0x46, 0x57, 0x5f, 0x52, 0x45,
	0x47, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x09,
	0x0a, 0x05, 0x45, 0x43, 0x5f, 0x52, 0x4f, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x43, 0x5f,
	0x52, 0x57, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x45, 0x43, 0x5f, 0x52, 0x4f, 0x5f, 0x42, 0x53,
	0x53, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x45, 0x43, 0x5f, 0x52, 0x57, 0x5f, 0x42, 0x53, 0x53,
	0x10, 0x04, 0x12, 0x11, 0x0a, 0x0d, 0x45, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x52, 0x45, 0x44, 0x5f,
	0x4d, 0x45, 0x4d, 0x10, 0x05, 0x1a, 0x49, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e,
	0x12, 0x14, 0x0a, 0x05, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52,
	0x05, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x18,
	0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04,
	0x74, 0x69, 0x6e, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x74, 0x69, 0x6e, 0x79,
	0x1a, 0x5a, 0x0a, 0x0c, 0x5a, 0x65, 0x70, 0x68, 0x79, 0x72, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74,
	0x12, 0x4a, 0x0a, 0x0e, 0x6b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69,
	0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d,
	0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x77, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x4d,
	0x65, 0x74, 0x72, 0x69, 0x63, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x6b,
	0x65, 0x72, 0x6e, 0x65, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x0c, 0x0a, 0x0a,
	0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x22, 0x46, 0x0a, 0x11, 0x46, 0x77,
	0x42, 0x75, 0x69, 0x6c, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x4c, 0x69, 0x73, 0x74, 0x12,
	0x31, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b,
	0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x77,
	0x42, 0x75, 0x69, 0x6c, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x05, 0x76, 0x61, 0x6c,
	0x75, 0x65, 0x22, 0x22, 0x0a, 0x0c, 0x46, 0x77, 0x54, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x72,
	0x69, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
	0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x44, 0x0a, 0x10, 0x46, 0x77, 0x54, 0x65, 0x73, 0x74,
	0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61,
	0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x68, 0x72, 0x6f,
	0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x77, 0x54, 0x65, 0x73, 0x74, 0x4d,
	0x65, 0x74, 0x72, 0x69, 0x63, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xb4, 0x01, 0x0a,
	0x1a, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x41, 0x6c, 0x6c, 0x54, 0x6f, 0x74, 0x46, 0x69, 0x72, 0x6d,
	0x77, 0x61, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x45, 0x0a, 0x11, 0x66,
	0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,
	0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74,
	0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x77, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,
	0x52, 0x10, 0x66, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69,
	0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x06, 0x63, 0x68, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01,
	0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e,
	0x43, 0x68, 0x72, 0x6f, 0x6f, 0x74, 0x52, 0x06, 0x63, 0x68, 0x72, 0x6f, 0x6f, 0x74, 0x12, 0x23,
	0x0a, 0x0d, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x18,
	0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x63, 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x76, 0x65, 0x72,
	0x61, 0x67, 0x65, 0x22, 0x58, 0x0a, 0x1b, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x41, 0x6c, 0x6c, 0x54,
	0x6f, 0x74, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
	0x73, 0x65, 0x12, 0x39, 0x0a, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x01, 0x20,
	0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61,
	0x70, 0x69, 0x2e, 0x46, 0x77, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63,
	0x4c, 0x69, 0x73, 0x74, 0x52, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0xb3, 0x01,
	0x0a, 0x19, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x54, 0x6f, 0x74, 0x46, 0x69, 0x72, 0x6d,
	0x77, 0x61, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x45, 0x0a, 0x11, 0x66,
	0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,
	0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74,
	0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x77, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,
	0x52, 0x10, 0x66, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69,
	0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x06, 0x63, 0x68, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01,
	0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e,
	0x43, 0x68, 0x72, 0x6f, 0x6f, 0x74, 0x52, 0x06, 0x63, 0x68, 0x72, 0x6f, 0x6f, 0x74, 0x12, 0x23,
	0x0a, 0x0d, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x18,
	0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x63, 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x76, 0x65, 0x72,
	0x61, 0x67, 0x65, 0x22, 0x56, 0x0a, 0x1a, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x54, 0x6f,
	0x74, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
	0x65, 0x12, 0x38, 0x0a, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x01, 0x20, 0x01,
	0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70,
	0x69, 0x2e, 0x46, 0x77, 0x54, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x4c, 0x69,
	0x73, 0x74, 0x52, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0xaf, 0x01, 0x0a, 0x17,
	0x42, 0x75, 0x69, 0x6c, 0x64, 0x41, 0x6c, 0x6c, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65,
	0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x43, 0x0a, 0x11, 0x66, 0x69, 0x72, 0x6d, 0x77,
	0x61, 0x72, 0x65, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01,
	0x28, 0x0e, 0x32, 0x16, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e,
	0x46, 0x77, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x69, 0x72, 0x6d,
	0x77, 0x61, 0x72, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x06,
	0x63, 0x68, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63,
	0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x43, 0x68, 0x72, 0x6f, 0x6f, 0x74,
	0x52, 0x06, 0x63, 0x68, 0x72, 0x6f, 0x6f, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6f, 0x64, 0x65,
	0x5f, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52,
	0x0c, 0x63, 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x22, 0x55, 0x0a,
	0x18, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x41, 0x6c, 0x6c, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72,
	0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, 0x07, 0x6d, 0x65, 0x74,
	0x72, 0x69, 0x63, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x68, 0x72,
	0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x77, 0x42, 0x75, 0x69, 0x6c,
	0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x07, 0x6d, 0x65, 0x74,
	0x72, 0x69, 0x63, 0x73, 0x22, 0xae, 0x01, 0x0a, 0x16, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c,
	0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12,
	0x43, 0x0a, 0x11, 0x66, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x5f, 0x6c, 0x6f, 0x63, 0x61,
	0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x63, 0x68, 0x72,
	0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x46, 0x77, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69,
	0x6f, 0x6e, 0x52, 0x10, 0x66, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x4c, 0x6f, 0x63, 0x61,
	0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x06, 0x63, 0x68, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x02,
	0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f,
	0x73, 0x2e, 0x43, 0x68, 0x72, 0x6f, 0x6f, 0x74, 0x52, 0x06, 0x63, 0x68, 0x72, 0x6f, 0x6f, 0x74,
	0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67,
	0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x63, 0x6f, 0x64, 0x65, 0x43, 0x6f, 0x76,
	0x65, 0x72, 0x61, 0x67, 0x65, 0x22, 0x53, 0x0a, 0x17, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c,
	0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
	0x12, 0x38, 0x0a, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28,
	0x0b, 0x32, 0x1e, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69,
	0x2e, 0x46, 0x77, 0x54, 0x65, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x4c, 0x69, 0x73,
	0x74, 0x52, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0xb9, 0x02, 0x0a, 0x1e, 0x42,
	0x75, 0x6e, 0x64, 0x6c, 0x65, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x41, 0x72, 0x74,
	0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a,
	0x06, 0x63, 0x68, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e,
	0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x43, 0x68, 0x72, 0x6f, 0x6f,
	0x74, 0x52, 0x06, 0x63, 0x68, 0x72, 0x6f, 0x6f, 0x74, 0x12, 0x37, 0x0a, 0x0b, 0x72, 0x65, 0x73,
	0x75, 0x6c, 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16,
	0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x75,
	0x6c, 0x74, 0x50, 0x61, 0x74, 0x68, 0x52, 0x0a, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x50, 0x61,
	0x74, 0x68, 0x12, 0x45, 0x0a, 0x09, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x18,
	0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d,
	0x6f, 0x73, 0x2e, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x42, 0x79, 0x53, 0x65,
	0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x52, 0x09,
	0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x12, 0x23, 0x0a, 0x0b, 0x62, 0x63, 0x73,
	0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02,
	0x18, 0x01, 0x52, 0x0a, 0x62, 0x63, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x46,
	0x0a, 0x10, 0x62, 0x63, 0x73, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e,
	0x66, 0x6f, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d,
	0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x63, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69,
	0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x62, 0x63, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69,
	0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x70, 0x0a, 0x1f, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65,
	0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74,
	0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4d, 0x0a, 0x09, 0x61, 0x72, 0x74,
	0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x63,
	0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64,
	0x65, 0x64, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x42, 0x79, 0x53, 0x65, 0x72,
	0x76, 0x69, 0x63, 0x65, 0x2e, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x52, 0x09, 0x61,
	0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x22, 0x9e, 0x06, 0x0a, 0x14, 0x46, 0x69, 0x72,
	0x6d, 0x77, 0x61, 0x72, 0x65, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x49, 0x6e, 0x66,
	0x6f, 0x12, 0x47, 0x0a, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03,
	0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70,
	0x69, 0x2e, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61,
	0x63, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x66,
	0x6f, 0x52, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x46, 0x0a, 0x10, 0x62, 0x63,
	0x73, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02,
	0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e,
	0x61, 0x70, 0x69, 0x2e, 0x42, 0x63, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x6e,
	0x66, 0x6f, 0x52, 0x0e, 0x62, 0x63, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x6e,
	0x66, 0x6f, 0x1a, 0xdb, 0x03, 0x0a, 0x0b, 0x54, 0x61, 0x72, 0x62, 0x61, 0x6c, 0x6c, 0x49, 0x6e,
	0x66, 0x6f, 0x12, 0x23, 0x0a, 0x0b, 0x62, 0x63, 0x73, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f,
	0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0a, 0x62, 0x63, 0x73,
	0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x13, 0x66, 0x69, 0x72, 0x6d, 0x77,
	0x61, 0x72, 0x65, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02,
	0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x66, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x49, 0x6d,
	0x61, 0x67, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x54, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18,
	0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x40, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65,
	0x2e, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x41, 0x72, 0x74,
	0x69, 0x66, 0x61, 0x63, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x54, 0x61, 0x72, 0x62, 0x61, 0x6c,
	0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x54, 0x79,
	0x70, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x54, 0x0a,
	0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x36,
	0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x69,
	0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x49, 0x6e,
	0x66, 0x6f, 0x2e, 0x54, 0x61, 0x72, 0x62, 0x61, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56,
	0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x02, 0x18, 0x01, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73,
	0x69, 0x6f, 0x6e, 0x12, 0x55, 0x0a, 0x15, 0x66, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x5f,
	0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01,
	0x28, 0x0b, 0x32, 0x21, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70,
	0x69, 0x2e, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f,
	0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x13, 0x66, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x56,
	0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x1a, 0x3d, 0x0a, 0x0c, 0x46, 0x69,
	0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x54, 0x79, 0x70, 0x65, 0x22, 0x2d, 0x0a, 0x04, 0x54, 0x79,
	0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12,
	0x08, 0x0a, 0x04, 0x4d, 0x41, 0x49, 0x4e, 0x10, 0x01, 0x12, 0x06, 0x0a, 0x02, 0x45, 0x43, 0x10,
	0x02, 0x12, 0x06, 0x0a, 0x02, 0x50, 0x44, 0x10, 0x03, 0x1a, 0x35, 0x0a, 0x07, 0x56, 0x65, 0x72,
	0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x18, 0x01, 0x20,
	0x01, 0x28, 0x05, 0x52, 0x05, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x69,
	0x6e, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6d, 0x69, 0x6e, 0x6f, 0x72,
	0x1a, 0x96, 0x01, 0x0a, 0x0a, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12,
	0x1b, 0x0a, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01,
	0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x53, 0x0a, 0x0c,
	0x74, 0x61, 0x72, 0x62, 0x61, 0x6c, 0x6c, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01,
	0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70,
	0x69, 0x2e, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61,
	0x63, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x54, 0x61, 0x72, 0x62, 0x61, 0x6c, 0x6c, 0x49, 0x6e,
	0x66, 0x6f, 0x48, 0x00, 0x52, 0x0b, 0x74, 0x61, 0x72, 0x62, 0x61, 0x6c, 0x6c, 0x49, 0x6e, 0x66,
	0x6f, 0x42, 0x16, 0x0a, 0x14, 0x66, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x5f, 0x6f, 0x62,
	0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x2a, 0x5e, 0x0a, 0x0a, 0x46, 0x77, 0x4c,
	0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x13, 0x46, 0x57, 0x5f, 0x4c, 0x4f,
	0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00,
	0x12, 0x0f, 0x0a, 0x0b, 0x50, 0x4c, 0x41, 0x54, 0x46, 0x4f, 0x52, 0x4d, 0x5f, 0x45, 0x43, 0x10,
	0x01, 0x12, 0x13, 0x0a, 0x0f, 0x50, 0x4c, 0x41, 0x54, 0x46, 0x4f, 0x52, 0x4d, 0x5f, 0x5a, 0x45,
	0x50, 0x48, 0x59, 0x52, 0x10, 0x02, 0x12, 0x11, 0x0a, 0x0d, 0x50, 0x4c, 0x41, 0x54, 0x46, 0x4f,
	0x52, 0x4d, 0x5f, 0x54, 0x49, 0x35, 0x30, 0x10, 0x03, 0x32, 0xb3, 0x04, 0x0a, 0x0f, 0x46, 0x69,
	0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x6a, 0x0a,
	0x13, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x41, 0x6c, 0x6c, 0x54, 0x6f, 0x74, 0x46, 0x69, 0x72, 0x6d,
	0x77, 0x61, 0x72, 0x65, 0x12, 0x28, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e,
	0x61, 0x70, 0x69, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x41, 0x6c, 0x6c, 0x54, 0x6f, 0x74, 0x46,
	0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29,
	0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x75,
	0x69, 0x6c, 0x64, 0x41, 0x6c, 0x6c, 0x54, 0x6f, 0x74, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72,
	0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x67, 0x0a, 0x12, 0x54, 0x65, 0x73,
	0x74, 0x41, 0x6c, 0x6c, 0x54, 0x6f, 0x74, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x12,
	0x27, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x54,
	0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x54, 0x6f, 0x74, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72,
	0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d,
	0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x54,
	0x6f, 0x74, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
	0x73, 0x65, 0x12, 0x61, 0x0a, 0x10, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x41, 0x6c, 0x6c, 0x46, 0x69,
	0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x12, 0x25, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74,
	0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x41, 0x6c, 0x6c, 0x46, 0x69,
	0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e,
	0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x75, 0x69,
	0x6c, 0x64, 0x41, 0x6c, 0x6c, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x52, 0x65, 0x73,
	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5e, 0x0a, 0x0f, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c,
	0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x12, 0x24, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d,
	0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x6c, 0x6c, 0x46,
	0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25,
	0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x54, 0x65,
	0x73, 0x74, 0x41, 0x6c, 0x6c, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x52, 0x65, 0x73,
	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x76, 0x0a, 0x17, 0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x46,
	0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73,
	0x12, 0x2c, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e,
	0x42, 0x75, 0x6e, 0x64, 0x6c, 0x65, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x41, 0x72,
	0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d,
	0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x75,
	0x6e, 0x64, 0x6c, 0x65, 0x46, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x41, 0x72, 0x74, 0x69,
	0x66, 0x61, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x1a, 0x10, 0xc2,
	0xed, 0x1a, 0x0c, 0x0a, 0x08, 0x66, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x10, 0x01, 0x42,
	0x38, 0x5a, 0x36, 0x67, 0x6f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x2e, 0x6f,
	0x72, 0x67, 0x2f, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2f, 0x69, 0x6e,
	0x66, 0x72, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x63, 0x68, 0x72,
	0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,
	0x33,
}

var (
	file_chromite_api_firmware_proto_rawDescOnce sync.Once
	file_chromite_api_firmware_proto_rawDescData = file_chromite_api_firmware_proto_rawDesc
)

func file_chromite_api_firmware_proto_rawDescGZIP() []byte {
	file_chromite_api_firmware_proto_rawDescOnce.Do(func() {
		file_chromite_api_firmware_proto_rawDescData = protoimpl.X.CompressGZIP(file_chromite_api_firmware_proto_rawDescData)
	})
	return file_chromite_api_firmware_proto_rawDescData
}

var file_chromite_api_firmware_proto_enumTypes = make([]protoimpl.EnumInfo, 3)
var file_chromite_api_firmware_proto_msgTypes = make([]protoimpl.MessageInfo, 24)
var file_chromite_api_firmware_proto_goTypes = []interface{}{
	(FwLocation)(0),                                         // 0: chromite.api.FwLocation
	(FwBuildMetric_FwSection_FwRegion)(0),                   // 1: chromite.api.FwBuildMetric.FwSection.FwRegion
	(FirmwareArtifactInfo_TarballInfo_FirmwareType_Type)(0), // 2: chromite.api.FirmwareArtifactInfo.TarballInfo.FirmwareType.Type
	(*BcsVersionInfo)(nil),                                  // 3: chromite.api.BcsVersionInfo
	(*FirmwareVersionInfo)(nil),                             // 4: chromite.api.FirmwareVersionInfo
	(*FwBuildMetric)(nil),                                   // 5: chromite.api.FwBuildMetric
	(*FwBuildMetricList)(nil),                               // 6: chromite.api.FwBuildMetricList
	(*FwTestMetric)(nil),                                    // 7: chromite.api.FwTestMetric
	(*FwTestMetricList)(nil),                                // 8: chromite.api.FwTestMetricList
	(*BuildAllTotFirmwareRequest)(nil),                      // 9: chromite.api.BuildAllTotFirmwareRequest
	(*BuildAllTotFirmwareResponse)(nil),                     // 10: chromite.api.BuildAllTotFirmwareResponse
	(*TestAllTotFirmwareRequest)(nil),                       // 11: chromite.api.TestAllTotFirmwareRequest
	(*TestAllTotFirmwareResponse)(nil),                      // 12: chromite.api.TestAllTotFirmwareResponse
	(*BuildAllFirmwareRequest)(nil),                         // 13: chromite.api.BuildAllFirmwareRequest
	(*BuildAllFirmwareResponse)(nil),                        // 14: chromite.api.BuildAllFirmwareResponse
	(*TestAllFirmwareRequest)(nil),                          // 15: chromite.api.TestAllFirmwareRequest
	(*TestAllFirmwareResponse)(nil),                         // 16: chromite.api.TestAllFirmwareResponse
	(*BundleFirmwareArtifactsRequest)(nil),                  // 17: chromite.api.BundleFirmwareArtifactsRequest
	(*BundleFirmwareArtifactsResponse)(nil),                 // 18: chromite.api.BundleFirmwareArtifactsResponse
	(*FirmwareArtifactInfo)(nil),                            // 19: chromite.api.FirmwareArtifactInfo
	(*FwBuildMetric_FwSection)(nil),                         // 20: chromite.api.FwBuildMetric.FwSection
	(*FwBuildMetric_Version)(nil),                           // 21: chromite.api.FwBuildMetric.Version
	(*FwBuildMetric_ZephyrTarget)(nil),                      // 22: chromite.api.FwBuildMetric.ZephyrTarget
	(*FirmwareArtifactInfo_TarballInfo)(nil),                // 23: chromite.api.FirmwareArtifactInfo.TarballInfo
	(*FirmwareArtifactInfo_ObjectInfo)(nil),                 // 24: chromite.api.FirmwareArtifactInfo.ObjectInfo
	(*FirmwareArtifactInfo_TarballInfo_FirmwareType)(nil),   // 25: chromite.api.FirmwareArtifactInfo.TarballInfo.FirmwareType
	(*FirmwareArtifactInfo_TarballInfo_Version)(nil),        // 26: chromite.api.FirmwareArtifactInfo.TarballInfo.Version
	(*chromiumos.Chroot)(nil),                               // 27: chromiumos.Chroot
	(chromiumos.FwLocation)(0),                              // 28: chromiumos.FwLocation
	(*chromiumos.ResultPath)(nil),                           // 29: chromiumos.ResultPath
	(*chromiumos.ArtifactsByService_Firmware)(nil),          // 30: chromiumos.ArtifactsByService.Firmware
	(*chromiumos.UploadedArtifactsByService_Firmware)(nil),  // 31: chromiumos.UploadedArtifactsByService.Firmware
}
var file_chromite_api_firmware_proto_depIdxs = []int32{
	20, // 0: chromite.api.FwBuildMetric.fw_section:type_name -> chromite.api.FwBuildMetric.FwSection
	22, // 1: chromite.api.FwBuildMetric.zephyr:type_name -> chromite.api.FwBuildMetric.ZephyrTarget
	5,  // 2: chromite.api.FwBuildMetricList.value:type_name -> chromite.api.FwBuildMetric
	7,  // 3: chromite.api.FwTestMetricList.value:type_name -> chromite.api.FwTestMetric
	0,  // 4: chromite.api.BuildAllTotFirmwareRequest.firmware_location:type_name -> chromite.api.FwLocation
	27, // 5: chromite.api.BuildAllTotFirmwareRequest.chroot:type_name -> chromiumos.Chroot
	6,  // 6: chromite.api.BuildAllTotFirmwareResponse.metrics:type_name -> chromite.api.FwBuildMetricList
	0,  // 7: chromite.api.TestAllTotFirmwareRequest.firmware_location:type_name -> chromite.api.FwLocation
	27, // 8: chromite.api.TestAllTotFirmwareRequest.chroot:type_name -> chromiumos.Chroot
	8,  // 9: chromite.api.TestAllTotFirmwareResponse.metrics:type_name -> chromite.api.FwTestMetricList
	28, // 10: chromite.api.BuildAllFirmwareRequest.firmware_location:type_name -> chromiumos.FwLocation
	27, // 11: chromite.api.BuildAllFirmwareRequest.chroot:type_name -> chromiumos.Chroot
	6,  // 12: chromite.api.BuildAllFirmwareResponse.metrics:type_name -> chromite.api.FwBuildMetricList
	28, // 13: chromite.api.TestAllFirmwareRequest.firmware_location:type_name -> chromiumos.FwLocation
	27, // 14: chromite.api.TestAllFirmwareRequest.chroot:type_name -> chromiumos.Chroot
	8,  // 15: chromite.api.TestAllFirmwareResponse.metrics:type_name -> chromite.api.FwTestMetricList
	27, // 16: chromite.api.BundleFirmwareArtifactsRequest.chroot:type_name -> chromiumos.Chroot
	29, // 17: chromite.api.BundleFirmwareArtifactsRequest.result_path:type_name -> chromiumos.ResultPath
	30, // 18: chromite.api.BundleFirmwareArtifactsRequest.artifacts:type_name -> chromiumos.ArtifactsByService.Firmware
	3,  // 19: chromite.api.BundleFirmwareArtifactsRequest.bcs_version_info:type_name -> chromite.api.BcsVersionInfo
	31, // 20: chromite.api.BundleFirmwareArtifactsResponse.artifacts:type_name -> chromiumos.UploadedArtifactsByService.Firmware
	24, // 21: chromite.api.FirmwareArtifactInfo.objects:type_name -> chromite.api.FirmwareArtifactInfo.ObjectInfo
	3,  // 22: chromite.api.FirmwareArtifactInfo.bcs_version_info:type_name -> chromite.api.BcsVersionInfo
	1,  // 23: chromite.api.FwBuildMetric.FwSection.region:type_name -> chromite.api.FwBuildMetric.FwSection.FwRegion
	21, // 24: chromite.api.FwBuildMetric.ZephyrTarget.kernel_version:type_name -> chromite.api.FwBuildMetric.Version
	2,  // 25: chromite.api.FirmwareArtifactInfo.TarballInfo.type:type_name -> chromite.api.FirmwareArtifactInfo.TarballInfo.FirmwareType.Type
	26, // 26: chromite.api.FirmwareArtifactInfo.TarballInfo.version:type_name -> chromite.api.FirmwareArtifactInfo.TarballInfo.Version
	4,  // 27: chromite.api.FirmwareArtifactInfo.TarballInfo.firmware_version_info:type_name -> chromite.api.FirmwareVersionInfo
	23, // 28: chromite.api.FirmwareArtifactInfo.ObjectInfo.tarball_info:type_name -> chromite.api.FirmwareArtifactInfo.TarballInfo
	9,  // 29: chromite.api.FirmwareService.BuildAllTotFirmware:input_type -> chromite.api.BuildAllTotFirmwareRequest
	11, // 30: chromite.api.FirmwareService.TestAllTotFirmware:input_type -> chromite.api.TestAllTotFirmwareRequest
	13, // 31: chromite.api.FirmwareService.BuildAllFirmware:input_type -> chromite.api.BuildAllFirmwareRequest
	15, // 32: chromite.api.FirmwareService.TestAllFirmware:input_type -> chromite.api.TestAllFirmwareRequest
	17, // 33: chromite.api.FirmwareService.BundleFirmwareArtifacts:input_type -> chromite.api.BundleFirmwareArtifactsRequest
	10, // 34: chromite.api.FirmwareService.BuildAllTotFirmware:output_type -> chromite.api.BuildAllTotFirmwareResponse
	12, // 35: chromite.api.FirmwareService.TestAllTotFirmware:output_type -> chromite.api.TestAllTotFirmwareResponse
	14, // 36: chromite.api.FirmwareService.BuildAllFirmware:output_type -> chromite.api.BuildAllFirmwareResponse
	16, // 37: chromite.api.FirmwareService.TestAllFirmware:output_type -> chromite.api.TestAllFirmwareResponse
	18, // 38: chromite.api.FirmwareService.BundleFirmwareArtifacts:output_type -> chromite.api.BundleFirmwareArtifactsResponse
	34, // [34:39] is the sub-list for method output_type
	29, // [29:34] is the sub-list for method input_type
	29, // [29:29] is the sub-list for extension type_name
	29, // [29:29] is the sub-list for extension extendee
	0,  // [0:29] is the sub-list for field type_name
}

func init() { file_chromite_api_firmware_proto_init() }
func file_chromite_api_firmware_proto_init() {
	if File_chromite_api_firmware_proto != nil {
		return
	}
	file_chromite_api_build_api_proto_init()
	if !protoimpl.UnsafeEnabled {
		file_chromite_api_firmware_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*BcsVersionInfo); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_firmware_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*FirmwareVersionInfo); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_firmware_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*FwBuildMetric); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_firmware_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*FwBuildMetricList); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_firmware_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*FwTestMetric); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_firmware_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*FwTestMetricList); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_firmware_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*BuildAllTotFirmwareRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_firmware_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*BuildAllTotFirmwareResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_firmware_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*TestAllTotFirmwareRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_firmware_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*TestAllTotFirmwareResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_firmware_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*BuildAllFirmwareRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_firmware_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*BuildAllFirmwareResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_firmware_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*TestAllFirmwareRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_firmware_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*TestAllFirmwareResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_firmware_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*BundleFirmwareArtifactsRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_firmware_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*BundleFirmwareArtifactsResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_firmware_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*FirmwareArtifactInfo); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_firmware_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*FwBuildMetric_FwSection); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_firmware_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*FwBuildMetric_Version); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_firmware_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*FwBuildMetric_ZephyrTarget); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_firmware_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*FirmwareArtifactInfo_TarballInfo); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_firmware_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*FirmwareArtifactInfo_ObjectInfo); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_firmware_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*FirmwareArtifactInfo_TarballInfo_FirmwareType); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_firmware_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*FirmwareArtifactInfo_TarballInfo_Version); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	file_chromite_api_firmware_proto_msgTypes[2].OneofWrappers = []interface{}{
		(*FwBuildMetric_Zephyr)(nil),
	}
	file_chromite_api_firmware_proto_msgTypes[21].OneofWrappers = []interface{}{
		(*FirmwareArtifactInfo_ObjectInfo_TarballInfo)(nil),
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_chromite_api_firmware_proto_rawDesc,
			NumEnums:      3,
			NumMessages:   24,
			NumExtensions: 0,
			NumServices:   1,
		},
		GoTypes:           file_chromite_api_firmware_proto_goTypes,
		DependencyIndexes: file_chromite_api_firmware_proto_depIdxs,
		EnumInfos:         file_chromite_api_firmware_proto_enumTypes,
		MessageInfos:      file_chromite_api_firmware_proto_msgTypes,
	}.Build()
	File_chromite_api_firmware_proto = out.File
	file_chromite_api_firmware_proto_rawDesc = nil
	file_chromite_api_firmware_proto_goTypes = nil
	file_chromite_api_firmware_proto_depIdxs = nil
}
