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

// Enum for various type of builders
type BuilderType int32

const (
	BuilderType_UNKNOWN_BUILDER_TYPE BuilderType = 0
	BuilderType_RELEASE              BuilderType = 1
)

var BuilderType_name = map[int32]string{
	0: "UNKNOWN_BUILDER_TYPE",
	1: "RELEASE",
}

var BuilderType_value = map[string]int32{
	"UNKNOWN_BUILDER_TYPE": 0,
	"RELEASE":              1,
}

func (x BuilderType) String() string {
	return proto.EnumName(BuilderType_name, int32(x))
}

func (BuilderType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_1535585e49f0fb45, []int{0}
}

type Architecture int32

const (
	Architecture_UNKNOWN      Architecture = 0
	Architecture_X86_INTERNAL Architecture = 1
	Architecture_ARM_INTERNAL Architecture = 2
)

var Architecture_name = map[int32]string{
	0: "UNKNOWN",
	1: "X86_INTERNAL",
	2: "ARM_INTERNAL",
}

var Architecture_value = map[string]int32{
	"UNKNOWN":      0,
	"X86_INTERNAL": 1,
	"ARM_INTERNAL": 2,
}

func (x Architecture) String() string {
	return proto.EnumName(Architecture_name, int32(x))
}

func (Architecture) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_1535585e49f0fb45, []int{1}
}

type Model struct {
	// The board name for this model.
	BoardName string `protobuf:"bytes,1,opt,name=board_name,json=boardName,proto3" json:"board_name,omitempty"`
	// The name of the model.
	Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
	// Defines which test suites should actually be run for a given model
	// when the release builder is setting up the hardware tests.
	TestSuites []string `protobuf:"bytes,3,rep,name=test_suites,json=testSuites,proto3" json:"test_suites,omitempty"`
	// Defines whether presubmit hardware tests should be run against a given
	// model as part of the commit queue.
	CqTestEnabled bool `protobuf:"varint,4,opt,name=cq_test_enabled,json=cqTestEnabled,proto3" json:"cq_test_enabled,omitempty"`
	// Defines the test pool that will be scheduled against for any HW tests
	// executed against the given model.
	ReleaseBuilderTestPool string `protobuf:"bytes,5,opt,name=release_builder_test_pool,json=releaseBuilderTestPool,proto3" json:"release_builder_test_pool,omitempty"`
	// The GoldenEye ID for the board of this model.
	// If the board does not exist, the field value will be 0.
	BoardId  int64 `protobuf:"varint,6,opt,name=board_id,json=boardId,proto3" json:"board_id,omitempty"`
	IsActive bool  `protobuf:"varint,7,opt,name=is_active,json=isActive,proto3" json:"is_active,omitempty"`
	// Hardware match for the model.
	HwidMatch            string   `protobuf:"bytes,8,opt,name=hwid_match,json=hwidMatch,proto3" json:"hwid_match,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Model proto.InternalMessageInfo

func (m *Model) GetBoardName() string {
	if m != nil {
		return m.BoardName
	}
	return ""
}

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

func (m *Model) GetTestSuites() []string {
	if m != nil {
		return m.TestSuites
	}
	return nil
}

func (m *Model) GetCqTestEnabled() bool {
	if m != nil {
		return m.CqTestEnabled
	}
	return false
}

func (m *Model) GetReleaseBuilderTestPool() string {
	if m != nil {
		return m.ReleaseBuilderTestPool
	}
	return ""
}

func (m *Model) GetBoardId() int64 {
	if m != nil {
		return m.BoardId
	}
	return 0
}

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

func (m *Model) GetHwidMatch() string {
	if m != nil {
		return m.HwidMatch
	}
	return ""
}

// Configuration required by BuildBot in order to generate a unified release
// builder with the appropriate model specific hardware test coverage.
// For context, see: go/cros-unibuild-hw-test
type ReferenceBoardUnifiedBuildConfig struct {
	// The name of the build that will be created by BuildBot.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// The name of the reference board this unified build is based upon.
	ReferenceBoardName string `protobuf:"bytes,2,opt,name=reference_board_name,json=referenceBoardName,proto3" json:"reference_board_name,omitempty"`
	// The instruction set architecture of the reference board.
	Arch Architecture `protobuf:"varint,3,opt,name=arch,proto3,enum=chromiumos.Architecture" json:"arch,omitempty"`
	// Whether this is a release build or not.
	Builder BuilderType `protobuf:"varint,4,opt,name=builder,proto3,enum=chromiumos.BuilderType" json:"builder,omitempty"`
	// Whether this build is considered experimental only.
	Experimental bool `protobuf:"varint,5,opt,name=experimental,proto3" json:"experimental,omitempty"`
	// The list of models that are based on the given reference board
	// and supported as part of the unified build.
	Models               []*Model `protobuf:"bytes,6,rep,name=models,proto3" json:"models,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ReferenceBoardUnifiedBuildConfig proto.InternalMessageInfo

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

func (m *ReferenceBoardUnifiedBuildConfig) GetReferenceBoardName() string {
	if m != nil {
		return m.ReferenceBoardName
	}
	return ""
}

func (m *ReferenceBoardUnifiedBuildConfig) GetArch() Architecture {
	if m != nil {
		return m.Arch
	}
	return Architecture_UNKNOWN
}

func (m *ReferenceBoardUnifiedBuildConfig) GetBuilder() BuilderType {
	if m != nil {
		return m.Builder
	}
	return BuilderType_UNKNOWN_BUILDER_TYPE
}

func (m *ReferenceBoardUnifiedBuildConfig) GetExperimental() bool {
	if m != nil {
		return m.Experimental
	}
	return false
}

func (m *ReferenceBoardUnifiedBuildConfig) GetModels() []*Model {
	if m != nil {
		return m.Models
	}
	return nil
}

// Message to represent a build config for a given builder
type Config struct {
	Builder              BuilderType  `protobuf:"varint,1,opt,name=builder,proto3,enum=chromiumos.BuilderType" json:"builder,omitempty"`
	Experimental         bool         `protobuf:"varint,2,opt,name=experimental,proto3" json:"experimental,omitempty"`
	LeaderBoard          bool         `protobuf:"varint,3,opt,name=leader_board,json=leaderBoard,proto3" json:"leader_board,omitempty"`
	BoardGroup           string       `protobuf:"bytes,4,opt,name=board_group,json=boardGroup,proto3" json:"board_group,omitempty"`
	Arch                 Architecture `protobuf:"varint,5,opt,name=arch,proto3,enum=chromiumos.Architecture" json:"arch,omitempty"`
	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
	XXX_unrecognized     []byte       `json:"-"`
	XXX_sizecache        int32        `json:"-"`
}

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

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

var xxx_messageInfo_Config proto.InternalMessageInfo

func (m *Config) GetBuilder() BuilderType {
	if m != nil {
		return m.Builder
	}
	return BuilderType_UNKNOWN_BUILDER_TYPE
}

func (m *Config) GetExperimental() bool {
	if m != nil {
		return m.Experimental
	}
	return false
}

func (m *Config) GetLeaderBoard() bool {
	if m != nil {
		return m.LeaderBoard
	}
	return false
}

func (m *Config) GetBoardGroup() string {
	if m != nil {
		return m.BoardGroup
	}
	return ""
}

func (m *Config) GetArch() Architecture {
	if m != nil {
		return m.Arch
	}
	return Architecture_UNKNOWN
}

// Message to represent a board in build configuration
type BuildBoard struct {
	Name                 string    `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	Configs              []*Config `protobuf:"bytes,2,rep,name=configs,proto3" json:"configs,omitempty"`
	XXX_NoUnkeyedLiteral struct{}  `json:"-"`
	XXX_unrecognized     []byte    `json:"-"`
	XXX_sizecache        int32     `json:"-"`
}

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

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

var xxx_messageInfo_BuildBoard proto.InternalMessageInfo

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

func (m *BuildBoard) GetConfigs() []*Config {
	if m != nil {
		return m.Configs
	}
	return nil
}

// Message to represent a build configuration.
// The JSON file from GE is this proto.
type GEConfig struct {
	MetadataVersion             string                              `protobuf:"bytes,1,opt,name=metadata_version,json=metadataVersion,proto3" json:"metadata_version,omitempty"`
	Boards                      []*BuildBoard                       `protobuf:"bytes,2,rep,name=boards,proto3" json:"boards,omitempty"`
	ReleaseBranch               bool                                `protobuf:"varint,3,opt,name=release_branch,json=releaseBranch,proto3" json:"release_branch,omitempty"`
	ReferenceBoardUnifiedBuilds []*ReferenceBoardUnifiedBuildConfig `protobuf:"bytes,4,rep,name=reference_board_unified_builds,json=referenceBoardUnifiedBuilds,proto3" json:"reference_board_unified_builds,omitempty"`
	XXX_NoUnkeyedLiteral        struct{}                            `json:"-"`
	XXX_unrecognized            []byte                              `json:"-"`
	XXX_sizecache               int32                               `json:"-"`
}

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

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

var xxx_messageInfo_GEConfig proto.InternalMessageInfo

func (m *GEConfig) GetMetadataVersion() string {
	if m != nil {
		return m.MetadataVersion
	}
	return ""
}

func (m *GEConfig) GetBoards() []*BuildBoard {
	if m != nil {
		return m.Boards
	}
	return nil
}

func (m *GEConfig) GetReleaseBranch() bool {
	if m != nil {
		return m.ReleaseBranch
	}
	return false
}

func (m *GEConfig) GetReferenceBoardUnifiedBuilds() []*ReferenceBoardUnifiedBuildConfig {
	if m != nil {
		return m.ReferenceBoardUnifiedBuilds
	}
	return nil
}

func init() {
	proto.RegisterEnum("chromiumos.BuilderType", BuilderType_name, BuilderType_value)
	proto.RegisterEnum("chromiumos.Architecture", Architecture_name, Architecture_value)
	proto.RegisterType((*Model)(nil), "chromiumos.Model")
	proto.RegisterType((*ReferenceBoardUnifiedBuildConfig)(nil), "chromiumos.ReferenceBoardUnifiedBuildConfig")
	proto.RegisterType((*Config)(nil), "chromiumos.Config")
	proto.RegisterType((*BuildBoard)(nil), "chromiumos.BuildBoard")
	proto.RegisterType((*GEConfig)(nil), "chromiumos.GEConfig")
}

func init() { proto.RegisterFile("chromiumos/ge_config.proto", fileDescriptor_1535585e49f0fb45) }

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