// Code generated by protoc-gen-go. DO NOT EDIT.
// source: test_platform/config/config.proto

package config

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	test_runner "go.chromium.org/chromiumos/infra/proto/go/test_platform/migration/test_runner"
	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

// Config defined configuration parameters of cros_test_platform.
type Config struct {
	SkylabSwarming      *Config_Swarming     `protobuf:"bytes,1,opt,name=skylab_swarming,json=skylabSwarming,proto3" json:"skylab_swarming,omitempty"`
	SkylabIsolate       *Config_Isolate      `protobuf:"bytes,3,opt,name=skylab_isolate,json=skylabIsolate,proto3" json:"skylab_isolate,omitempty"`
	SkylabWorker        *Config_SkylabWorker `protobuf:"bytes,4,opt,name=skylab_worker,json=skylabWorker,proto3" json:"skylab_worker,omitempty"`
	Versioning          *Config_Versioning   `protobuf:"bytes,7,opt,name=versioning,proto3" json:"versioning,omitempty"`
	TestRunner          *Config_TestRunner   `protobuf:"bytes,8,opt,name=test_runner,json=testRunner,proto3" json:"test_runner,omitempty"`
	TestRunnerMigration *test_runner.Config  `protobuf:"bytes,9,opt,name=test_runner_migration,json=testRunnerMigration,proto3" json:"test_runner_migration,omitempty"`
	// TODO(crbug.com/1132489) Delete once builders stop using this.
	Pubsub *Config_PubSub `protobuf:"bytes,10,opt,name=pubsub,proto3" json:"pubsub,omitempty"` // Deprecated: Do not use.
	// go/ctp-result-flow: CTP publishes a message with build ID, once
	// at build start and again at build end
	ResultFlowChannel    *Config_PubSub `protobuf:"bytes,11,opt,name=result_flow_channel,json=resultFlowChannel,proto3" json:"result_flow_channel,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_2c858eded7d7f900, []int{0}
}

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) GetSkylabSwarming() *Config_Swarming {
	if m != nil {
		return m.SkylabSwarming
	}
	return nil
}

func (m *Config) GetSkylabIsolate() *Config_Isolate {
	if m != nil {
		return m.SkylabIsolate
	}
	return nil
}

func (m *Config) GetSkylabWorker() *Config_SkylabWorker {
	if m != nil {
		return m.SkylabWorker
	}
	return nil
}

func (m *Config) GetVersioning() *Config_Versioning {
	if m != nil {
		return m.Versioning
	}
	return nil
}

func (m *Config) GetTestRunner() *Config_TestRunner {
	if m != nil {
		return m.TestRunner
	}
	return nil
}

func (m *Config) GetTestRunnerMigration() *test_runner.Config {
	if m != nil {
		return m.TestRunnerMigration
	}
	return nil
}

// Deprecated: Do not use.
func (m *Config) GetPubsub() *Config_PubSub {
	if m != nil {
		return m.Pubsub
	}
	return nil
}

func (m *Config) GetResultFlowChannel() *Config_PubSub {
	if m != nil {
		return m.ResultFlowChannel
	}
	return nil
}

// Swarming defines configuration parameters related to a swarming instance.
type Config_Swarming struct {
	Server               string   `protobuf:"bytes,1,opt,name=server,proto3" json:"server,omitempty"`
	AuthJsonPath         string   `protobuf:"bytes,2,opt,name=auth_json_path,json=authJsonPath,proto3" json:"auth_json_path,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Config_Swarming proto.InternalMessageInfo

func (m *Config_Swarming) GetServer() string {
	if m != nil {
		return m.Server
	}
	return ""
}

func (m *Config_Swarming) GetAuthJsonPath() string {
	if m != nil {
		return m.AuthJsonPath
	}
	return ""
}

// Isolate defines configuration parameters related to an isolate instance.
type Config_Isolate struct {
	AuthJsonPath         string   `protobuf:"bytes,1,opt,name=auth_json_path,json=authJsonPath,proto3" json:"auth_json_path,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Config_Isolate proto.InternalMessageInfo

func (m *Config_Isolate) GetAuthJsonPath() string {
	if m != nil {
		return m.AuthJsonPath
	}
	return ""
}

// SkylabWorker defines configuration parameters related to
// skylab_swarming_worker.
type Config_SkylabWorker struct {
	// LUCI project for tasks; e.g. "chromeos"
	LuciProject string `protobuf:"bytes,1,opt,name=luci_project,json=luciProject,proto3" json:"luci_project,omitempty"`
	// LogDog host for test task logs, e.g. luci-logdog.appspot.com
	LogDogHost           string   `protobuf:"bytes,2,opt,name=log_dog_host,json=logDogHost,proto3" json:"log_dog_host,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Config_SkylabWorker proto.InternalMessageInfo

func (m *Config_SkylabWorker) GetLuciProject() string {
	if m != nil {
		return m.LuciProject
	}
	return ""
}

func (m *Config_SkylabWorker) GetLogDogHost() string {
	if m != nil {
		return m.LogDogHost
	}
	return ""
}

// Versioning defines configuration parameters dictating which versions of
// the downstream components to use.
type Config_Versioning struct {
	CrosTestPlatformBinary *Config_Versioning_CrosTestPlatformBinary `protobuf:"bytes,1,opt,name=cros_test_platform_binary,json=crosTestPlatformBinary,proto3" json:"cros_test_platform_binary,omitempty"`
	XXX_NoUnkeyedLiteral   struct{}                                  `json:"-"`
	XXX_unrecognized       []byte                                    `json:"-"`
	XXX_sizecache          int32                                     `json:"-"`
}

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

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

var xxx_messageInfo_Config_Versioning proto.InternalMessageInfo

func (m *Config_Versioning) GetCrosTestPlatformBinary() *Config_Versioning_CrosTestPlatformBinary {
	if m != nil {
		return m.CrosTestPlatformBinary
	}
	return nil
}

// CrosTestPlatformBinary describes which cros_test_platform version to
// use.
type Config_Versioning_CrosTestPlatformBinary struct {
	// Use the CIPD version with this label.
	CipdLabel            string   `protobuf:"bytes,1,opt,name=cipd_label,json=cipdLabel,proto3" json:"cipd_label,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Config_Versioning_CrosTestPlatformBinary proto.InternalMessageInfo

func (m *Config_Versioning_CrosTestPlatformBinary) GetCipdLabel() string {
	if m != nil {
		return m.CipdLabel
	}
	return ""
}

// Buildbucket defines configuration parameters of a builder.
type Config_Buildbucket struct {
	// Buildbucket host, e.g. "cr-buildbucket.appspot.com".
	Host string `protobuf:"bytes,1,opt,name=host,proto3" json:"host,omitempty"`
	// Project+bucket+builder serves as a unique builder identifier, see
	// BuilderID in the build proto:
	// https://cs.chromium.org/search/?q=f:build.proto+BuilderID
	Project              string   `protobuf:"bytes,2,opt,name=project,proto3" json:"project,omitempty"`
	Bucket               string   `protobuf:"bytes,3,opt,name=bucket,proto3" json:"bucket,omitempty"`
	Builder              string   `protobuf:"bytes,4,opt,name=builder,proto3" json:"builder,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Config_Buildbucket proto.InternalMessageInfo

func (m *Config_Buildbucket) GetHost() string {
	if m != nil {
		return m.Host
	}
	return ""
}

func (m *Config_Buildbucket) GetProject() string {
	if m != nil {
		return m.Project
	}
	return ""
}

func (m *Config_Buildbucket) GetBucket() string {
	if m != nil {
		return m.Bucket
	}
	return ""
}

func (m *Config_Buildbucket) GetBuilder() string {
	if m != nil {
		return m.Builder
	}
	return ""
}

// PubSub defines the configuration parameters for PubSub topic.
type Config_PubSub struct {
	Project              string   `protobuf:"bytes,1,opt,name=project,proto3" json:"project,omitempty"`
	Topic                string   `protobuf:"bytes,2,opt,name=topic,proto3" json:"topic,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Config_PubSub proto.InternalMessageInfo

func (m *Config_PubSub) GetProject() string {
	if m != nil {
		return m.Project
	}
	return ""
}

func (m *Config_PubSub) GetTopic() string {
	if m != nil {
		return m.Topic
	}
	return ""
}

// TestRunner defines configuration parameters related to the test_runner
// recipe.
type Config_TestRunner struct {
	Buildbucket *Config_Buildbucket `protobuf:"bytes,1,opt,name=buildbucket,proto3" json:"buildbucket,omitempty"`
	// TODO(crbug.com/1132489) Delete once builders stop using this.
	Pubsub *Config_PubSub `protobuf:"bytes,2,opt,name=pubsub,proto3" json:"pubsub,omitempty"` // Deprecated: Do not use.
	// go/ctp-result-flow: Trigger result flow processing of test runner
	// results.
	ResultFlowChannel *Config_PubSub `protobuf:"bytes,3,opt,name=result_flow_channel,json=resultFlowChannel,proto3" json:"result_flow_channel,omitempty"`
	// go/buildbucket-pubsub: Buildbucket status updates for child builds.
	BbStatusUpdateChannel *Config_PubSub `protobuf:"bytes,4,opt,name=bb_status_update_channel,json=bbStatusUpdateChannel,proto3" json:"bb_status_update_channel,omitempty"`
	XXX_NoUnkeyedLiteral  struct{}       `json:"-"`
	XXX_unrecognized      []byte         `json:"-"`
	XXX_sizecache         int32          `json:"-"`
}

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

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

var xxx_messageInfo_Config_TestRunner proto.InternalMessageInfo

func (m *Config_TestRunner) GetBuildbucket() *Config_Buildbucket {
	if m != nil {
		return m.Buildbucket
	}
	return nil
}

// Deprecated: Do not use.
func (m *Config_TestRunner) GetPubsub() *Config_PubSub {
	if m != nil {
		return m.Pubsub
	}
	return nil
}

func (m *Config_TestRunner) GetResultFlowChannel() *Config_PubSub {
	if m != nil {
		return m.ResultFlowChannel
	}
	return nil
}

func (m *Config_TestRunner) GetBbStatusUpdateChannel() *Config_PubSub {
	if m != nil {
		return m.BbStatusUpdateChannel
	}
	return nil
}

func init() {
	proto.RegisterType((*Config)(nil), "test_platform.config.Config")
	proto.RegisterType((*Config_Swarming)(nil), "test_platform.config.Config.Swarming")
	proto.RegisterType((*Config_Isolate)(nil), "test_platform.config.Config.Isolate")
	proto.RegisterType((*Config_SkylabWorker)(nil), "test_platform.config.Config.SkylabWorker")
	proto.RegisterType((*Config_Versioning)(nil), "test_platform.config.Config.Versioning")
	proto.RegisterType((*Config_Versioning_CrosTestPlatformBinary)(nil), "test_platform.config.Config.Versioning.CrosTestPlatformBinary")
	proto.RegisterType((*Config_Buildbucket)(nil), "test_platform.config.Config.Buildbucket")
	proto.RegisterType((*Config_PubSub)(nil), "test_platform.config.Config.PubSub")
	proto.RegisterType((*Config_TestRunner)(nil), "test_platform.config.Config.TestRunner")
}

func init() { proto.RegisterFile("test_platform/config/config.proto", fileDescriptor_2c858eded7d7f900) }

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