// Code generated by protoc-gen-go. DO NOT EDIT.
// source: chromiumos/bot_scaling.proto

package chromiumos

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	math "math"
)

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package

// Specifies mode for a bot policy
type BotPolicy_Mode int32

const (
	BotPolicy_UNKNOWN_MODE BotPolicy_Mode = 0
	// Collect stats only for a bot group.
	BotPolicy_MONITORED BotPolicy_Mode = 1
	// Generate configuration updates for bot group.
	BotPolicy_CONFIGURED BotPolicy_Mode = 2
)

var BotPolicy_Mode_name = map[int32]string{
	0: "UNKNOWN_MODE",
	1: "MONITORED",
	2: "CONFIGURED",
}

var BotPolicy_Mode_value = map[string]int32{
	"UNKNOWN_MODE": 0,
	"MONITORED":    1,
	"CONFIGURED":   2,
}

func (x BotPolicy_Mode) String() string {
	return proto.EnumName(BotPolicy_Mode_name, int32(x))
}

func (BotPolicy_Mode) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_dbe70eabfd64e7ef, []int{2, 0}
}

// Specifies mode for a bot scaling
type BotPolicy_BotScalingMode int32

const (
	BotPolicy_UNKNOWN_SCALING_MODE BotPolicy_BotScalingMode = 0
	// Scale up or down bots by the step size associated with bot group..
	BotPolicy_STEPPED BotPolicy_BotScalingMode = 1
	// Scale up or down bots by the demand on the bot group.
	// For use on smaller bot groups that are susceptible to smaller increases.
	BotPolicy_DEMAND BotPolicy_BotScalingMode = 2
	// Scale down bots by the step size associated with bot group.
	// Scale up bots by the demand on the bot group.
	BotPolicy_STEPPED_DECREASE BotPolicy_BotScalingMode = 3
)

var BotPolicy_BotScalingMode_name = map[int32]string{
	0: "UNKNOWN_SCALING_MODE",
	1: "STEPPED",
	2: "DEMAND",
	3: "STEPPED_DECREASE",
}

var BotPolicy_BotScalingMode_value = map[string]int32{
	"UNKNOWN_SCALING_MODE": 0,
	"STEPPED":              1,
	"DEMAND":               2,
	"STEPPED_DECREASE":     3,
}

func (x BotPolicy_BotScalingMode) String() string {
	return proto.EnumName(BotPolicy_BotScalingMode_name, int32(x))
}

func (BotPolicy_BotScalingMode) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_dbe70eabfd64e7ef, []int{2, 1}
}

// Specifies mode for a bot policy
type ReducedBotPolicy_Mode int32

const (
	ReducedBotPolicy_UNKNOWN_MODE ReducedBotPolicy_Mode = 0
	// Collect stats only for a bot group.
	ReducedBotPolicy_MONITORED ReducedBotPolicy_Mode = 1
	// Generate configuration updates for bot group.
	ReducedBotPolicy_CONFIGURED ReducedBotPolicy_Mode = 2
)

var ReducedBotPolicy_Mode_name = map[int32]string{
	0: "UNKNOWN_MODE",
	1: "MONITORED",
	2: "CONFIGURED",
}

var ReducedBotPolicy_Mode_value = map[string]int32{
	"UNKNOWN_MODE": 0,
	"MONITORED":    1,
	"CONFIGURED":   2,
}

func (x ReducedBotPolicy_Mode) String() string {
	return proto.EnumName(ReducedBotPolicy_Mode_name, int32(x))
}

func (ReducedBotPolicy_Mode) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_dbe70eabfd64e7ef, []int{4, 0}
}

// Specifies if there has been a change since the last iteration.
type ScalingAction_Actionable int32

const (
	ScalingAction_UNSPECIFIED ScalingAction_Actionable = 0
	// There is a change since last time.
	ScalingAction_YES ScalingAction_Actionable = 1
	// There is no change since last time.
	ScalingAction_NO ScalingAction_Actionable = 2
)

var ScalingAction_Actionable_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "YES",
	2: "NO",
}

var ScalingAction_Actionable_value = map[string]int32{
	"UNSPECIFIED": 0,
	"YES":         1,
	"NO":          2,
}

func (x ScalingAction_Actionable) String() string {
	return proto.EnumName(ScalingAction_Actionable_name, int32(x))
}

func (ScalingAction_Actionable) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_dbe70eabfd64e7ef, []int{6, 0}
}

// Defines a type of bot associated with a bot group.
type BotType struct {
	// The string bot "shirt size" to be requested for the group.
	BotSize string `protobuf:"bytes,1,opt,name=bot_size,json=botSize,proto3" json:"bot_size,omitempty"`
	// The number of cores per bot. Will be used to limit quota usage.
	CoresPerBot float32 `protobuf:"fixed32,2,opt,name=cores_per_bot,json=coresPerBot,proto3" json:"cores_per_bot,omitempty"`
	// Estimated hourly cost.
	HourlyCost float32 `protobuf:"fixed32,3,opt,name=hourly_cost,json=hourlyCost,proto3" json:"hourly_cost,omitempty"`
	// Amount of memory in GB allocated to bot.
	MemoryGb             float32  `protobuf:"fixed32,4,opt,name=memory_gb,json=memoryGb,proto3" json:"memory_gb,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_BotType proto.InternalMessageInfo

func (m *BotType) GetBotSize() string {
	if m != nil {
		return m.BotSize
	}
	return ""
}

func (m *BotType) GetCoresPerBot() float32 {
	if m != nil {
		return m.CoresPerBot
	}
	return 0
}

func (m *BotType) GetHourlyCost() float32 {
	if m != nil {
		return m.HourlyCost
	}
	return 0
}

func (m *BotType) GetMemoryGb() float32 {
	if m != nil {
		return m.MemoryGb
	}
	return 0
}

// Defines Swarming dimensions associated with a bot group.
type SwarmingDimension struct {
	// Dimesion name
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Dimension value
	Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
	// Dimension multiple values
	Values               []string `protobuf:"bytes,3,rep,name=values,proto3" json:"values,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_SwarmingDimension proto.InternalMessageInfo

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

func (m *SwarmingDimension) GetValue() string {
	if m != nil {
		return m.Value
	}
	return ""
}

func (m *SwarmingDimension) GetValues() []string {
	if m != nil {
		return m.Values
	}
	return nil
}

// Bot Policy to apply to a bot group.
type BotPolicy struct {
	// Bot group controlled by this policy, like, 'cq', 'postsubmit',...
	BotGroup string `protobuf:"bytes,1,opt,name=bot_group,json=botGroup,proto3" json:"bot_group,omitempty"`
	// The type of bot to be requested.
	BotType            *BotType                       `protobuf:"bytes,2,opt,name=bot_type,json=botType,proto3" json:"bot_type,omitempty"`
	ScalingRestriction *BotPolicy_ScalingRestriction  `protobuf:"bytes,3,opt,name=scaling_restriction,json=scalingRestriction,proto3" json:"scaling_restriction,omitempty"`
	RegionRestrictions []*BotPolicy_RegionRestriction `protobuf:"bytes,4,rep,name=region_restrictions,json=regionRestrictions,proto3" json:"region_restrictions,omitempty"`
	// A set of dimensions used to validate current Swarming allocations.
	SwarmingDimensions []*SwarmingDimension `protobuf:"bytes,5,rep,name=swarming_dimensions,json=swarmingDimensions,proto3" json:"swarming_dimensions,omitempty"`
	// Set whether a bot group should be configured or only monitored.
	PolicyMode BotPolicy_Mode `protobuf:"varint,6,opt,name=policy_mode,json=policyMode,proto3,enum=chromiumos.BotPolicy_Mode" json:"policy_mode,omitempty"`
	// Number of hours to lookback for Swarming stats.
	LookbackHours int32 `protobuf:"zigzag32,7,opt,name=lookback_hours,json=lookbackHours,proto3" json:"lookback_hours,omitempty"`
	// Set the scaling approach for the bot group being monitored.
	ScalingMode BotPolicy_BotScalingMode `protobuf:"varint,8,opt,name=scaling_mode,json=scalingMode,proto3,enum=chromiumos.BotPolicy_BotScalingMode" json:"scaling_mode,omitempty"`
	// Swarming instance name:  chromeos-swarming.appspot.com
	SwarmingInstance string `protobuf:"bytes,9,opt,name=swarming_instance,json=swarmingInstance,proto3" json:"swarming_instance,omitempty"`
	// Application namespace within Swarming instance.
	Application          string   `protobuf:"bytes,10,opt,name=application,proto3" json:"application,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_BotPolicy proto.InternalMessageInfo

func (m *BotPolicy) GetBotGroup() string {
	if m != nil {
		return m.BotGroup
	}
	return ""
}

func (m *BotPolicy) GetBotType() *BotType {
	if m != nil {
		return m.BotType
	}
	return nil
}

func (m *BotPolicy) GetScalingRestriction() *BotPolicy_ScalingRestriction {
	if m != nil {
		return m.ScalingRestriction
	}
	return nil
}

func (m *BotPolicy) GetRegionRestrictions() []*BotPolicy_RegionRestriction {
	if m != nil {
		return m.RegionRestrictions
	}
	return nil
}

func (m *BotPolicy) GetSwarmingDimensions() []*SwarmingDimension {
	if m != nil {
		return m.SwarmingDimensions
	}
	return nil
}

func (m *BotPolicy) GetPolicyMode() BotPolicy_Mode {
	if m != nil {
		return m.PolicyMode
	}
	return BotPolicy_UNKNOWN_MODE
}

func (m *BotPolicy) GetLookbackHours() int32 {
	if m != nil {
		return m.LookbackHours
	}
	return 0
}

func (m *BotPolicy) GetScalingMode() BotPolicy_BotScalingMode {
	if m != nil {
		return m.ScalingMode
	}
	return BotPolicy_UNKNOWN_SCALING_MODE
}

func (m *BotPolicy) GetSwarmingInstance() string {
	if m != nil {
		return m.SwarmingInstance
	}
	return ""
}

func (m *BotPolicy) GetApplication() string {
	if m != nil {
		return m.Application
	}
	return ""
}

// Scaling restriction specifies the limits on how the group can be
// expanded or reduced.
type BotPolicy_ScalingRestriction struct {
	// Hard limit on the maximum number of bots to request.
	BotCeiling int32 `protobuf:"varint,1,opt,name=bot_ceiling,json=botCeiling,proto3" json:"bot_ceiling,omitempty"`
	// Hard limit on the minimum number of bots to request.
	BotFloor int32 `protobuf:"varint,2,opt,name=bot_floor,json=botFloor,proto3" json:"bot_floor,omitempty"`
	// Soft limit on the number of idle bots to maintain.
	MinIdle int32 `protobuf:"varint,3,opt,name=min_idle,json=minIdle,proto3" json:"min_idle,omitempty"`
	// Hard minimum limit on the absolute delta between request amount and
	// existing bot count.
	StepSize int32 `protobuf:"varint,4,opt,name=step_size,json=stepSize,proto3" json:"step_size,omitempty"`
	// Static number to request when demand is not accessible.
	BotFallback          int32    `protobuf:"varint,5,opt,name=bot_fallback,json=botFallback,proto3" json:"bot_fallback,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_BotPolicy_ScalingRestriction proto.InternalMessageInfo

func (m *BotPolicy_ScalingRestriction) GetBotCeiling() int32 {
	if m != nil {
		return m.BotCeiling
	}
	return 0
}

func (m *BotPolicy_ScalingRestriction) GetBotFloor() int32 {
	if m != nil {
		return m.BotFloor
	}
	return 0
}

func (m *BotPolicy_ScalingRestriction) GetMinIdle() int32 {
	if m != nil {
		return m.MinIdle
	}
	return 0
}

func (m *BotPolicy_ScalingRestriction) GetStepSize() int32 {
	if m != nil {
		return m.StepSize
	}
	return 0
}

func (m *BotPolicy_ScalingRestriction) GetBotFallback() int32 {
	if m != nil {
		return m.BotFallback
	}
	return 0
}

// A set of restrictions on the regions and how to distribute bots
// between them.
type BotPolicy_RegionRestriction struct {
	// Region of the bot sub-group.
	Region string `protobuf:"bytes,1,opt,name=region,proto3" json:"region,omitempty"`
	// Specific prefix of the bot sub-group.
	Prefix string `protobuf:"bytes,2,opt,name=prefix,proto3" json:"prefix,omitempty"`
	// Weight to be applied to this sub-group. The number of bots requested
	// from each region will be proportional to the weight unless a
	// quota limit is violated.
	Weight               float32  `protobuf:"fixed32,3,opt,name=weight,proto3" json:"weight,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_BotPolicy_RegionRestriction proto.InternalMessageInfo

func (m *BotPolicy_RegionRestriction) GetRegion() string {
	if m != nil {
		return m.Region
	}
	return ""
}

func (m *BotPolicy_RegionRestriction) GetPrefix() string {
	if m != nil {
		return m.Prefix
	}
	return ""
}

func (m *BotPolicy_RegionRestriction) GetWeight() float32 {
	if m != nil {
		return m.Weight
	}
	return 0
}

// Configures the root message.
type BotPolicyCfg struct {
	// All bot policies.
	BotPolicies          []*BotPolicy `protobuf:"bytes,1,rep,name=bot_policies,json=botPolicies,proto3" json:"bot_policies,omitempty"`
	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
	XXX_unrecognized     []byte       `json:"-"`
	XXX_sizecache        int32        `json:"-"`
}

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

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

var xxx_messageInfo_BotPolicyCfg proto.InternalMessageInfo

func (m *BotPolicyCfg) GetBotPolicies() []*BotPolicy {
	if m != nil {
		return m.BotPolicies
	}
	return nil
}

// Reduced version of BotPolicy meant for output properties
type ReducedBotPolicy struct {
	// Bot group controlled by this policy, like, 'cq', 'postsubmit',...
	BotGroup string `protobuf:"bytes,1,opt,name=bot_group,json=botGroup,proto3" json:"bot_group,omitempty"`
	// The type of bot to be requested.
	BotType *BotType `protobuf:"bytes,2,opt,name=bot_type,json=botType,proto3" json:"bot_type,omitempty"`
	// Set whether a bot group should be configured or only monitored.
	PolicyMode           ReducedBotPolicy_Mode `protobuf:"varint,3,opt,name=policy_mode,json=policyMode,proto3,enum=chromiumos.ReducedBotPolicy_Mode" json:"policy_mode,omitempty"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

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

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

var xxx_messageInfo_ReducedBotPolicy proto.InternalMessageInfo

func (m *ReducedBotPolicy) GetBotGroup() string {
	if m != nil {
		return m.BotGroup
	}
	return ""
}

func (m *ReducedBotPolicy) GetBotType() *BotType {
	if m != nil {
		return m.BotType
	}
	return nil
}

func (m *ReducedBotPolicy) GetPolicyMode() ReducedBotPolicy_Mode {
	if m != nil {
		return m.PolicyMode
	}
	return ReducedBotPolicy_UNKNOWN_MODE
}

// Configures the root message.
type ReducedBotPolicyCfg struct {
	// All bot policies in reduced form.
	BotPolicies          []*ReducedBotPolicy `protobuf:"bytes,1,rep,name=bot_policies,json=botPolicies,proto3" json:"bot_policies,omitempty"`
	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
	XXX_unrecognized     []byte              `json:"-"`
	XXX_sizecache        int32               `json:"-"`
}

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

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

var xxx_messageInfo_ReducedBotPolicyCfg proto.InternalMessageInfo

func (m *ReducedBotPolicyCfg) GetBotPolicies() []*ReducedBotPolicy {
	if m != nil {
		return m.BotPolicies
	}
	return nil
}

// Scaling Action that resulted because of bot demand.
type ScalingAction struct {
	// Bot group modified by the action. Should be the same as BotPolicy.
	BotGroup string `protobuf:"bytes,1,opt,name=bot_group,json=botGroup,proto3" json:"bot_group,omitempty"`
	// The type of bot requested. Should be the same as BotPolicy.
	BotType *BotType `protobuf:"bytes,2,opt,name=bot_type,json=botType,proto3" json:"bot_type,omitempty"`
	// Whether there has been a change in the number of bots requested
	// for this bot group. See step_size for more info.
	Actionable ScalingAction_Actionable `protobuf:"varint,3,opt,name=actionable,proto3,enum=chromiumos.ScalingAction_Actionable" json:"actionable,omitempty"`
	// Total number of bots requested for the group.
	BotsRequested   int32                           `protobuf:"varint,4,opt,name=bots_requested,json=botsRequested,proto3" json:"bots_requested,omitempty"`
	RegionalActions []*ScalingAction_RegionalAction `protobuf:"bytes,5,rep,name=regional_actions,json=regionalActions,proto3" json:"regional_actions,omitempty"`
	// Estimated savings based on current run.
	// Based on current number of bots compared against the max.
	EstimatedSavings float32 `protobuf:"fixed32,6,opt,name=estimated_savings,json=estimatedSavings,proto3" json:"estimated_savings,omitempty"`
	// Minimum number of bots to keep alive for bot group.
	// Repeated for display/reporting purposes
	BotMin int32 `protobuf:"varint,7,opt,name=bot_min,json=botMin,proto3" json:"bot_min,omitempty"`
	// Hard limit on the maximum number of bots that can be requested.
	// Repeated for display/reporting purposes
	BotMax int32 `protobuf:"varint,8,opt,name=bot_max,json=botMax,proto3" json:"bot_max,omitempty"`
	// Application namespace within Swarming instance.
	Application          string   `protobuf:"bytes,9,opt,name=application,proto3" json:"application,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ScalingAction proto.InternalMessageInfo

func (m *ScalingAction) GetBotGroup() string {
	if m != nil {
		return m.BotGroup
	}
	return ""
}

func (m *ScalingAction) GetBotType() *BotType {
	if m != nil {
		return m.BotType
	}
	return nil
}

func (m *ScalingAction) GetActionable() ScalingAction_Actionable {
	if m != nil {
		return m.Actionable
	}
	return ScalingAction_UNSPECIFIED
}

func (m *ScalingAction) GetBotsRequested() int32 {
	if m != nil {
		return m.BotsRequested
	}
	return 0
}

func (m *ScalingAction) GetRegionalActions() []*ScalingAction_RegionalAction {
	if m != nil {
		return m.RegionalActions
	}
	return nil
}

func (m *ScalingAction) GetEstimatedSavings() float32 {
	if m != nil {
		return m.EstimatedSavings
	}
	return 0
}

func (m *ScalingAction) GetBotMin() int32 {
	if m != nil {
		return m.BotMin
	}
	return 0
}

func (m *ScalingAction) GetBotMax() int32 {
	if m != nil {
		return m.BotMax
	}
	return 0
}

func (m *ScalingAction) GetApplication() string {
	if m != nil {
		return m.Application
	}
	return ""
}

// How the bot requests are distributed between regions & prefixes.
type ScalingAction_RegionalAction struct {
	// Region of the bot sub-group.
	Region string `protobuf:"bytes,1,opt,name=region,proto3" json:"region,omitempty"`
	// Specific prefix of the bot sub-group.
	Prefix string `protobuf:"bytes,2,opt,name=prefix,proto3" json:"prefix,omitempty"`
	// Number of bots requested from the sub-group.
	BotsRequested        int32    `protobuf:"varint,3,opt,name=bots_requested,json=botsRequested,proto3" json:"bots_requested,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ScalingAction_RegionalAction proto.InternalMessageInfo

func (m *ScalingAction_RegionalAction) GetRegion() string {
	if m != nil {
		return m.Region
	}
	return ""
}

func (m *ScalingAction_RegionalAction) GetPrefix() string {
	if m != nil {
		return m.Prefix
	}
	return ""
}

func (m *ScalingAction_RegionalAction) GetBotsRequested() int32 {
	if m != nil {
		return m.BotsRequested
	}
	return 0
}

// Resource utilization based on regional assignment.
type ResourceUtilization struct {
	// Region of the bot sub-group.
	Region string `protobuf:"bytes,1,opt,name=region,proto3" json:"region,omitempty"`
	// Number of VMs allocated across all bot groups.
	Vms int32 `protobuf:"varint,2,opt,name=vms,proto3" json:"vms,omitempty"`
	// Number of CPUs allocated across all bot groups.
	Cpus float32 `protobuf:"fixed32,3,opt,name=cpus,proto3" json:"cpus,omitempty"`
	// Amount of memory in GB allocated across all bot groups.
	MemoryGb float32 `protobuf:"fixed32,4,opt,name=memory_gb,json=memoryGb,proto3" json:"memory_gb,omitempty"`
	// Amount of disk in GB allocated across all bot groups.
	DiskGb float32 `protobuf:"fixed32,5,opt,name=disk_gb,json=diskGb,proto3" json:"disk_gb,omitempty"`
	// NUmber of CPUs that could be allocated based on max values.
	MaxCpus              float32  `protobuf:"fixed32,6,opt,name=max_cpus,json=maxCpus,proto3" json:"max_cpus,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ResourceUtilization proto.InternalMessageInfo

func (m *ResourceUtilization) GetRegion() string {
	if m != nil {
		return m.Region
	}
	return ""
}

func (m *ResourceUtilization) GetVms() int32 {
	if m != nil {
		return m.Vms
	}
	return 0
}

func (m *ResourceUtilization) GetCpus() float32 {
	if m != nil {
		return m.Cpus
	}
	return 0
}

func (m *ResourceUtilization) GetMemoryGb() float32 {
	if m != nil {
		return m.MemoryGb
	}
	return 0
}

func (m *ResourceUtilization) GetDiskGb() float32 {
	if m != nil {
		return m.DiskGb
	}
	return 0
}

func (m *ResourceUtilization) GetMaxCpus() float32 {
	if m != nil {
		return m.MaxCpus
	}
	return 0
}

// Application utilization, per application at a
// regional assignment.
type ApplicationUtilization struct {
	// Application namespace to associate resources.
	Application          string                 `protobuf:"bytes,1,opt,name=application,proto3" json:"application,omitempty"`
	ResourceUtilization  []*ResourceUtilization `protobuf:"bytes,2,rep,name=resource_utilization,json=resourceUtilization,proto3" json:"resource_utilization,omitempty"`
	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
	XXX_unrecognized     []byte                 `json:"-"`
	XXX_sizecache        int32                  `json:"-"`
}

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

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

var xxx_messageInfo_ApplicationUtilization proto.InternalMessageInfo

func (m *ApplicationUtilization) GetApplication() string {
	if m != nil {
		return m.Application
	}
	return ""
}

func (m *ApplicationUtilization) GetResourceUtilization() []*ResourceUtilization {
	if m != nil {
		return m.ResourceUtilization
	}
	return nil
}

// All the actions that will be executed by RoboCrop.
type RoboCropAction struct {
	// List of an action per bot group scaled by RoboCrop.
	ScalingActions          []*ScalingAction          `protobuf:"bytes,1,rep,name=scaling_actions,json=scalingActions,proto3" json:"scaling_actions,omitempty"`
	ResourceUtilization     []*ResourceUtilization    `protobuf:"bytes,2,rep,name=resource_utilization,json=resourceUtilization,proto3" json:"resource_utilization,omitempty"`
	ApplResourceUtilization []*ApplicationUtilization `protobuf:"bytes,3,rep,name=appl_resource_utilization,json=applResourceUtilization,proto3" json:"appl_resource_utilization,omitempty"`
	XXX_NoUnkeyedLiteral    struct{}                  `json:"-"`
	XXX_unrecognized        []byte                    `json:"-"`
	XXX_sizecache           int32                     `json:"-"`
}

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

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

var xxx_messageInfo_RoboCropAction proto.InternalMessageInfo

func (m *RoboCropAction) GetScalingActions() []*ScalingAction {
	if m != nil {
		return m.ScalingActions
	}
	return nil
}

func (m *RoboCropAction) GetResourceUtilization() []*ResourceUtilization {
	if m != nil {
		return m.ResourceUtilization
	}
	return nil
}

func (m *RoboCropAction) GetApplResourceUtilization() []*ApplicationUtilization {
	if m != nil {
		return m.ApplResourceUtilization
	}
	return nil
}

func init() {
	proto.RegisterEnum("chromiumos.BotPolicy_Mode", BotPolicy_Mode_name, BotPolicy_Mode_value)
	proto.RegisterEnum("chromiumos.BotPolicy_BotScalingMode", BotPolicy_BotScalingMode_name, BotPolicy_BotScalingMode_value)
	proto.RegisterEnum("chromiumos.ReducedBotPolicy_Mode", ReducedBotPolicy_Mode_name, ReducedBotPolicy_Mode_value)
	proto.RegisterEnum("chromiumos.ScalingAction_Actionable", ScalingAction_Actionable_name, ScalingAction_Actionable_value)
	proto.RegisterType((*BotType)(nil), "chromiumos.BotType")
	proto.RegisterType((*SwarmingDimension)(nil), "chromiumos.SwarmingDimension")
	proto.RegisterType((*BotPolicy)(nil), "chromiumos.BotPolicy")
	proto.RegisterType((*BotPolicy_ScalingRestriction)(nil), "chromiumos.BotPolicy.ScalingRestriction")
	proto.RegisterType((*BotPolicy_RegionRestriction)(nil), "chromiumos.BotPolicy.RegionRestriction")
	proto.RegisterType((*BotPolicyCfg)(nil), "chromiumos.BotPolicyCfg")
	proto.RegisterType((*ReducedBotPolicy)(nil), "chromiumos.ReducedBotPolicy")
	proto.RegisterType((*ReducedBotPolicyCfg)(nil), "chromiumos.ReducedBotPolicyCfg")
	proto.RegisterType((*ScalingAction)(nil), "chromiumos.ScalingAction")
	proto.RegisterType((*ScalingAction_RegionalAction)(nil), "chromiumos.ScalingAction.RegionalAction")
	proto.RegisterType((*ResourceUtilization)(nil), "chromiumos.ResourceUtilization")
	proto.RegisterType((*ApplicationUtilization)(nil), "chromiumos.ApplicationUtilization")
	proto.RegisterType((*RoboCropAction)(nil), "chromiumos.RoboCropAction")
}

func init() { proto.RegisterFile("chromiumos/bot_scaling.proto", fileDescriptor_dbe70eabfd64e7ef) }

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