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