// Copyright 2019 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

//
//This proto matches the schema of paygen.json. An example
//of which looks like the following:
//
//{
//"delta": [
//{
//"board": {
//"public_codename": "AU from FSI to RSI in Beta channel",
//"is_active": false,
//"builder_name": "AU from FSI to RSI in Beta channel"
//},
//"delta_type": "NO_DELTA",
//"generate_delta": false,
//"delta_payload_tests": false,
//"full_payload_tests": false
//},
//...
//{
//"board": { ...
//...
//}
//]
//}

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

package chromiumos

import (
	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)
)

// An enum of possible delta types.
type PayloadProperties_DeltaType int32

const (
	PayloadProperties_NOT_SET        PayloadProperties_DeltaType = 0
	PayloadProperties_NO_DELTA       PayloadProperties_DeltaType = 1
	PayloadProperties_OMAHA          PayloadProperties_DeltaType = 2
	PayloadProperties_STEPPING_STONE PayloadProperties_DeltaType = 3
	PayloadProperties_MILESTONE      PayloadProperties_DeltaType = 4
	PayloadProperties_FSI            PayloadProperties_DeltaType = 5
)

// Enum value maps for PayloadProperties_DeltaType.
var (
	PayloadProperties_DeltaType_name = map[int32]string{
		0: "NOT_SET",
		1: "NO_DELTA",
		2: "OMAHA",
		3: "STEPPING_STONE",
		4: "MILESTONE",
		5: "FSI",
	}
	PayloadProperties_DeltaType_value = map[string]int32{
		"NOT_SET":        0,
		"NO_DELTA":       1,
		"OMAHA":          2,
		"STEPPING_STONE": 3,
		"MILESTONE":      4,
		"FSI":            5,
	}
)

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

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

func (PayloadProperties_DeltaType) Descriptor() protoreflect.EnumDescriptor {
	return file_chromiumos_payload_config_proto_enumTypes[0].Descriptor()
}

func (PayloadProperties_DeltaType) Type() protoreflect.EnumType {
	return &file_chromiumos_payload_config_proto_enumTypes[0]
}

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

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

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

	// This is current configuration for payloads.
	Delta []*PayloadProperties `protobuf:"bytes,1,rep,name=delta,proto3" json:"delta,omitempty"`
}

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

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

func (*PayloadConfig) ProtoMessage() {}

func (x *PayloadConfig) ProtoReflect() protoreflect.Message {
	mi := &file_chromiumos_payload_config_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 PayloadConfig.ProtoReflect.Descriptor instead.
func (*PayloadConfig) Descriptor() ([]byte, []int) {
	return file_chromiumos_payload_config_proto_rawDescGZIP(), []int{0}
}

func (x *PayloadConfig) GetDelta() []*PayloadProperties {
	if x != nil {
		return x.Delta
	}
	return nil
}

// This is a single payload config field.
type PayloadProperties struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The board to be considered for signing.
	Board *PayloadProperties_Board `protobuf:"bytes,1,opt,name=board,proto3" json:"board,omitempty"`
	// The delta type to generate for the payload.
	DeltaType PayloadProperties_DeltaType `protobuf:"varint,2,opt,name=delta_type,json=deltaType,proto3,enum=chromiumos.PayloadProperties_DeltaType" json:"delta_type,omitempty"`
	// The channel to sign payloads for (e.g. 'dev', 'stable', or '').
	Channel string `protobuf:"bytes,3,opt,name=channel,proto3" json:"channel,omitempty"`
	// The chrome os version (e.g. '12240.0.0' or '').
	ChromeOsVersion string `protobuf:"bytes,4,opt,name=chrome_os_version,json=chromeOsVersion,proto3" json:"chrome_os_version,omitempty"`
	// The version of chrome within the payload (e.g. '78.0.3877.0').
	ChromeVersion string `protobuf:"bytes,5,opt,name=chrome_version,json=chromeVersion,proto3" json:"chrome_version,omitempty"`
	// The milestone number (e.g. 73).
	Milestone uint32 `protobuf:"varint,6,opt,name=milestone,proto3" json:"milestone,omitempty"`
	// Generate the image update deltas.
	GenerateDelta bool `protobuf:"varint,7,opt,name=generate_delta,json=generateDelta,proto3" json:"generate_delta,omitempty"`
	// Test the image update deltas we generated post signing.
	DeltaPayloadTests bool `protobuf:"varint,8,opt,name=delta_payload_tests,json=deltaPayloadTests,proto3" json:"delta_payload_tests,omitempty"`
	// Do a full payload test.
	FullPayloadTests bool `protobuf:"varint,9,opt,name=full_payload_tests,json=fullPayloadTests,proto3" json:"full_payload_tests,omitempty"`
	// An array of model names: ['teemo', 'kench', 'sion'].
	// While we generally don't like repeated scalars, it conforms to the json.
	ApplicableModels []string `protobuf:"bytes,10,rep,name=applicable_models,json=applicableModels,proto3" json:"applicable_models,omitempty"`
}

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

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

func (*PayloadProperties) ProtoMessage() {}

func (x *PayloadProperties) ProtoReflect() protoreflect.Message {
	mi := &file_chromiumos_payload_config_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 PayloadProperties.ProtoReflect.Descriptor instead.
func (*PayloadProperties) Descriptor() ([]byte, []int) {
	return file_chromiumos_payload_config_proto_rawDescGZIP(), []int{1}
}

func (x *PayloadProperties) GetBoard() *PayloadProperties_Board {
	if x != nil {
		return x.Board
	}
	return nil
}

func (x *PayloadProperties) GetDeltaType() PayloadProperties_DeltaType {
	if x != nil {
		return x.DeltaType
	}
	return PayloadProperties_NOT_SET
}

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

func (x *PayloadProperties) GetChromeOsVersion() string {
	if x != nil {
		return x.ChromeOsVersion
	}
	return ""
}

func (x *PayloadProperties) GetChromeVersion() string {
	if x != nil {
		return x.ChromeVersion
	}
	return ""
}

func (x *PayloadProperties) GetMilestone() uint32 {
	if x != nil {
		return x.Milestone
	}
	return 0
}

func (x *PayloadProperties) GetGenerateDelta() bool {
	if x != nil {
		return x.GenerateDelta
	}
	return false
}

func (x *PayloadProperties) GetDeltaPayloadTests() bool {
	if x != nil {
		return x.DeltaPayloadTests
	}
	return false
}

func (x *PayloadProperties) GetFullPayloadTests() bool {
	if x != nil {
		return x.FullPayloadTests
	}
	return false
}

func (x *PayloadProperties) GetApplicableModels() []string {
	if x != nil {
		return x.ApplicableModels
	}
	return nil
}

// A board type and builder name, and if it is currently active.
type PayloadProperties_Board struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The board's public codename (e.g. nyan-kitty).
	PublicCodename string `protobuf:"bytes,1,opt,name=public_codename,json=publicCodename,proto3" json:"public_codename,omitempty"`
	// Is the board currently being supported.
	IsActive bool `protobuf:"varint,2,opt,name=is_active,json=isActive,proto3" json:"is_active,omitempty"`
	// What is the builder name for the board (e.g. nyan_kitty).
	BuilderName string `protobuf:"bytes,3,opt,name=builder_name,json=builderName,proto3" json:"builder_name,omitempty"`
}

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

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

func (*PayloadProperties_Board) ProtoMessage() {}

func (x *PayloadProperties_Board) ProtoReflect() protoreflect.Message {
	mi := &file_chromiumos_payload_config_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 PayloadProperties_Board.ProtoReflect.Descriptor instead.
func (*PayloadProperties_Board) Descriptor() ([]byte, []int) {
	return file_chromiumos_payload_config_proto_rawDescGZIP(), []int{1, 0}
}

func (x *PayloadProperties_Board) GetPublicCodename() string {
	if x != nil {
		return x.PublicCodename
	}
	return ""
}

func (x *PayloadProperties_Board) GetIsActive() bool {
	if x != nil {
		return x.IsActive
	}
	return false
}

func (x *PayloadProperties_Board) GetBuilderName() string {
	if x != nil {
		return x.BuilderName
	}
	return ""
}

var File_chromiumos_payload_config_proto protoreflect.FileDescriptor

var file_chromiumos_payload_config_proto_rawDesc = []byte{
	0x0a, 0x1f, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2f, 0x70, 0x61, 0x79,
	0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74,
	0x6f, 0x12, 0x0a, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x22, 0x44, 0x0a,
	0x0d, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x33,
	0x0a, 0x05, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e,
	0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x50, 0x61, 0x79, 0x6c, 0x6f,
	0x61, 0x64, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x05, 0x64, 0x65,
	0x6c, 0x74, 0x61, 0x22, 0xa4, 0x05, 0x0a, 0x11, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x50,
	0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x05, 0x62, 0x6f, 0x61,
	0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d,
	0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f,
	0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x2e, 0x42, 0x6f, 0x61, 0x72, 0x64, 0x52, 0x05, 0x62,
	0x6f, 0x61, 0x72, 0x64, 0x12, 0x46, 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x5f, 0x74, 0x79,
	0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d,
	0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f,
	0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x2e, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x54, 0x79, 0x70,
	0x65, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x07,
	0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63,
	0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x2a, 0x0a, 0x11, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x65,
	0x5f, 0x6f, 0x73, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28,
	0x09, 0x52, 0x0f, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x4f, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69,
	0x6f, 0x6e, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x5f, 0x76, 0x65, 0x72,
	0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x68, 0x72, 0x6f,
	0x6d, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x6d, 0x69, 0x6c,
	0x65, 0x73, 0x74, 0x6f, 0x6e, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x6d, 0x69,
	0x6c, 0x65, 0x73, 0x74, 0x6f, 0x6e, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x67, 0x65, 0x6e, 0x65, 0x72,
	0x61, 0x74, 0x65, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52,
	0x0d, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x12, 0x2e,
	0x0a, 0x13, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x5f,
	0x74, 0x65, 0x73, 0x74, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x64, 0x65, 0x6c,
	0x74, 0x61, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x54, 0x65, 0x73, 0x74, 0x73, 0x12, 0x2c,
	0x0a, 0x12, 0x66, 0x75, 0x6c, 0x6c, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x74,
	0x65, 0x73, 0x74, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x66, 0x75, 0x6c, 0x6c,
	0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x54, 0x65, 0x73, 0x74, 0x73, 0x12, 0x2b, 0x0a, 0x11,
	0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c,
	0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61,
	0x62, 0x6c, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x1a, 0x70, 0x0a, 0x05, 0x42, 0x6f, 0x61,
	0x72, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x63, 0x6f, 0x64,
	0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x70, 0x75, 0x62,
	0x6c, 0x69, 0x63, 0x43, 0x6f, 0x64, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x69,
	0x73, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08,
	0x69, 0x73, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x75, 0x69, 0x6c,
	0x64, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b,
	0x62, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x5d, 0x0a, 0x09, 0x44,
	0x65, 0x6c, 0x74, 0x61, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x4e, 0x4f, 0x54, 0x5f,
	0x53, 0x45, 0x54, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x4e, 0x4f, 0x5f, 0x44, 0x45, 0x4c, 0x54,
	0x41, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x4f, 0x4d, 0x41, 0x48, 0x41, 0x10, 0x02, 0x12, 0x12,
	0x0a, 0x0e, 0x53, 0x54, 0x45, 0x50, 0x50, 0x49, 0x4e, 0x47, 0x5f, 0x53, 0x54, 0x4f, 0x4e, 0x45,
	0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x4d, 0x49, 0x4c, 0x45, 0x53, 0x54, 0x4f, 0x4e, 0x45, 0x10,
	0x04, 0x12, 0x07, 0x0a, 0x03, 0x46, 0x53, 0x49, 0x10, 0x05, 0x42, 0x36, 0x5a, 0x34, 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, 0x75, 0x6d,
	0x6f, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_chromiumos_payload_config_proto_rawDescOnce sync.Once
	file_chromiumos_payload_config_proto_rawDescData = file_chromiumos_payload_config_proto_rawDesc
)

func file_chromiumos_payload_config_proto_rawDescGZIP() []byte {
	file_chromiumos_payload_config_proto_rawDescOnce.Do(func() {
		file_chromiumos_payload_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_chromiumos_payload_config_proto_rawDescData)
	})
	return file_chromiumos_payload_config_proto_rawDescData
}

var file_chromiumos_payload_config_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_chromiumos_payload_config_proto_msgTypes = make([]protoimpl.MessageInfo, 3)
var file_chromiumos_payload_config_proto_goTypes = []interface{}{
	(PayloadProperties_DeltaType)(0), // 0: chromiumos.PayloadProperties.DeltaType
	(*PayloadConfig)(nil),            // 1: chromiumos.PayloadConfig
	(*PayloadProperties)(nil),        // 2: chromiumos.PayloadProperties
	(*PayloadProperties_Board)(nil),  // 3: chromiumos.PayloadProperties.Board
}
var file_chromiumos_payload_config_proto_depIdxs = []int32{
	2, // 0: chromiumos.PayloadConfig.delta:type_name -> chromiumos.PayloadProperties
	3, // 1: chromiumos.PayloadProperties.board:type_name -> chromiumos.PayloadProperties.Board
	0, // 2: chromiumos.PayloadProperties.delta_type:type_name -> chromiumos.PayloadProperties.DeltaType
	3, // [3:3] is the sub-list for method output_type
	3, // [3:3] is the sub-list for method input_type
	3, // [3:3] is the sub-list for extension type_name
	3, // [3:3] is the sub-list for extension extendee
	0, // [0:3] is the sub-list for field type_name
}

func init() { file_chromiumos_payload_config_proto_init() }
func file_chromiumos_payload_config_proto_init() {
	if File_chromiumos_payload_config_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_chromiumos_payload_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*PayloadConfig); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromiumos_payload_config_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*PayloadProperties); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromiumos_payload_config_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*PayloadProperties_Board); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_chromiumos_payload_config_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   3,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_chromiumos_payload_config_proto_goTypes,
		DependencyIndexes: file_chromiumos_payload_config_proto_depIdxs,
		EnumInfos:         file_chromiumos_payload_config_proto_enumTypes,
		MessageInfos:      file_chromiumos_payload_config_proto_msgTypes,
	}.Build()
	File_chromiumos_payload_config_proto = out.File
	file_chromiumos_payload_config_proto_rawDesc = nil
	file_chromiumos_payload_config_proto_goTypes = nil
	file_chromiumos_payload_config_proto_depIdxs = nil
}
