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

package steps

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

type ExecuteRequests struct {
	// Each ExecuteRequest is handled independently.
	Requests       []*ExecuteRequest          `protobuf:"bytes,1,rep,name=requests,proto3" json:"requests,omitempty"`
	TaggedRequests map[string]*ExecuteRequest `protobuf:"bytes,2,rep,name=tagged_requests,json=taggedRequests,proto3" json:"tagged_requests,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
	// Build contains relevant information about the current test platform
	// buildbucket build.
	Build                *execute.Build `protobuf:"bytes,3,opt,name=build,proto3" json:"build,omitempty"`
	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
	XXX_unrecognized     []byte         `json:"-"`
	XXX_sizecache        int32          `json:"-"`
}

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

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

var xxx_messageInfo_ExecuteRequests proto.InternalMessageInfo

func (m *ExecuteRequests) GetRequests() []*ExecuteRequest {
	if m != nil {
		return m.Requests
	}
	return nil
}

func (m *ExecuteRequests) GetTaggedRequests() map[string]*ExecuteRequest {
	if m != nil {
		return m.TaggedRequests
	}
	return nil
}

func (m *ExecuteRequests) GetBuild() *execute.Build {
	if m != nil {
		return m.Build
	}
	return nil
}

type ExecuteResponses struct {
	// Each ExecuteResponse corresponds to a single ExecuteRequest handled
	// independently.
	Responses            []*ExecuteResponse          `protobuf:"bytes,1,rep,name=responses,proto3" json:"responses,omitempty"`
	TaggedResponses      map[string]*ExecuteResponse `protobuf:"bytes,2,rep,name=tagged_responses,json=taggedResponses,proto3" json:"tagged_responses,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
	XXX_NoUnkeyedLiteral struct{}                    `json:"-"`
	XXX_unrecognized     []byte                      `json:"-"`
	XXX_sizecache        int32                       `json:"-"`
}

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

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

var xxx_messageInfo_ExecuteResponses proto.InternalMessageInfo

func (m *ExecuteResponses) GetResponses() []*ExecuteResponse {
	if m != nil {
		return m.Responses
	}
	return nil
}

func (m *ExecuteResponses) GetTaggedResponses() map[string]*ExecuteResponse {
	if m != nil {
		return m.TaggedResponses
	}
	return nil
}

// ExecuteRequest defines the input of the Execute step.
type ExecuteRequest struct {
	// RequestParams are the request-wide parameters for the
	// cros_test_platform request. This includes all the request-wide information
	// needed in order to execute tests (e.g. labels, retry parameters,
	// scheduling parameters).
	RequestParams        *test_platform.Request_Params `protobuf:"bytes,1,opt,name=request_params,json=requestParams,proto3" json:"request_params,omitempty"`
	Enumeration          *EnumerationResponse          `protobuf:"bytes,2,opt,name=enumeration,proto3" json:"enumeration,omitempty"`
	Config               *config.Config                `protobuf:"bytes,3,opt,name=config,proto3" json:"config,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                      `json:"-"`
	XXX_unrecognized     []byte                        `json:"-"`
	XXX_sizecache        int32                         `json:"-"`
}

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

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

var xxx_messageInfo_ExecuteRequest proto.InternalMessageInfo

func (m *ExecuteRequest) GetRequestParams() *test_platform.Request_Params {
	if m != nil {
		return m.RequestParams
	}
	return nil
}

func (m *ExecuteRequest) GetEnumeration() *EnumerationResponse {
	if m != nil {
		return m.Enumeration
	}
	return nil
}

func (m *ExecuteRequest) GetConfig() *config.Config {
	if m != nil {
		return m.Config
	}
	return nil
}

// ExecuteResponse defines the output of the Execute step.
type ExecuteResponse struct {
	// Use consolidated_results instead.
	TaskResults         []*ExecuteResponse_TaskResult         `protobuf:"bytes,1,rep,name=task_results,json=taskResults,proto3" json:"task_results,omitempty"` // Deprecated: Do not use.
	ConsolidatedResults []*ExecuteResponse_ConsolidatedResult `protobuf:"bytes,3,rep,name=consolidated_results,json=consolidatedResults,proto3" json:"consolidated_results,omitempty"`
	// State encodes the state of the overall execution, including the ultimate
	// verdict (taking into account any sub-task verdicts).
	State                *test_platform.TaskState `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                 `json:"-"`
	XXX_unrecognized     []byte                   `json:"-"`
	XXX_sizecache        int32                    `json:"-"`
}

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

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

var xxx_messageInfo_ExecuteResponse proto.InternalMessageInfo

// Deprecated: Do not use.
func (m *ExecuteResponse) GetTaskResults() []*ExecuteResponse_TaskResult {
	if m != nil {
		return m.TaskResults
	}
	return nil
}

func (m *ExecuteResponse) GetConsolidatedResults() []*ExecuteResponse_ConsolidatedResult {
	if m != nil {
		return m.ConsolidatedResults
	}
	return nil
}

func (m *ExecuteResponse) GetState() *test_platform.TaskState {
	if m != nil {
		return m.State
	}
	return nil
}

type ExecuteResponse_TaskResult struct {
	// URL at which a human can view the task's run state (e.g. link to
	// swarming or cautotest job view).
	TaskUrl string                   `protobuf:"bytes,2,opt,name=task_url,json=taskUrl,proto3" json:"task_url,omitempty"`
	State   *test_platform.TaskState `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"`
	Name    string                   `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"`
	// URL at which a human can view the task's logs (e.g. a link to
	// stainless gs viewer for this task).
	LogUrl string `protobuf:"bytes,5,opt,name=log_url,json=logUrl,proto3" json:"log_url,omitempty"`
	// The attempt number, starting at 0.
	// Within an execution, the tuple (name, attempt) will be unique.
	Attempt int32 `protobuf:"varint,6,opt,name=attempt,proto3" json:"attempt,omitempty"`
	// The results of individual test cases that were executed as part of
	// the task.
	TestCases []*ExecuteResponse_TaskResult_TestCaseResult `protobuf:"bytes,7,rep,name=test_cases,json=testCases,proto3" json:"test_cases,omitempty"`
	// The results of steps run prior to running the actual tests
	// (e.g. provision).
	PrejobSteps []*ExecuteResponse_TaskResult_TestCaseResult `protobuf:"bytes,8,rep,name=prejob_steps,json=prejobSteps,proto3" json:"prejob_steps,omitempty"`
	// Logdata is the location at which the task's full output will
	// eventually be available. Not intended for human's to view; use
	// log_url instead.
	LogData *common.TaskLogData `protobuf:"bytes,9,opt,name=log_data,json=logData,proto3" json:"log_data,omitempty"`
	// Location, as URL, at which to place low-latency, high-importance
	// log data which fails the task if not offloaded properly.
	SynchronousLogDataUrl string `protobuf:"bytes,10,opt,name=synchronous_log_data_url,json=synchronousLogDataUrl,proto3" json:"synchronous_log_data_url,omitempty"`
	// Any rejected task dimensions from the task execution request,
	// stored as key-value pairs. This field is only populated if the
	// task was rejected by Swarming due to a lack of matching bot.
	RejectedTaskDimensions map[string]string `protobuf:"bytes,11,rep,name=rejected_task_dimensions,json=rejectedTaskDimensions,proto3" json:"rejected_task_dimensions,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
	XXX_NoUnkeyedLiteral   struct{}          `json:"-"`
	XXX_unrecognized       []byte            `json:"-"`
	XXX_sizecache          int32             `json:"-"`
}

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

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

var xxx_messageInfo_ExecuteResponse_TaskResult proto.InternalMessageInfo

func (m *ExecuteResponse_TaskResult) GetTaskUrl() string {
	if m != nil {
		return m.TaskUrl
	}
	return ""
}

func (m *ExecuteResponse_TaskResult) GetState() *test_platform.TaskState {
	if m != nil {
		return m.State
	}
	return nil
}

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

func (m *ExecuteResponse_TaskResult) GetLogUrl() string {
	if m != nil {
		return m.LogUrl
	}
	return ""
}

func (m *ExecuteResponse_TaskResult) GetAttempt() int32 {
	if m != nil {
		return m.Attempt
	}
	return 0
}

func (m *ExecuteResponse_TaskResult) GetTestCases() []*ExecuteResponse_TaskResult_TestCaseResult {
	if m != nil {
		return m.TestCases
	}
	return nil
}

func (m *ExecuteResponse_TaskResult) GetPrejobSteps() []*ExecuteResponse_TaskResult_TestCaseResult {
	if m != nil {
		return m.PrejobSteps
	}
	return nil
}

func (m *ExecuteResponse_TaskResult) GetLogData() *common.TaskLogData {
	if m != nil {
		return m.LogData
	}
	return nil
}

func (m *ExecuteResponse_TaskResult) GetSynchronousLogDataUrl() string {
	if m != nil {
		return m.SynchronousLogDataUrl
	}
	return ""
}

func (m *ExecuteResponse_TaskResult) GetRejectedTaskDimensions() map[string]string {
	if m != nil {
		return m.RejectedTaskDimensions
	}
	return nil
}

type ExecuteResponse_TaskResult_TestCaseResult struct {
	// Test case name which is generally independent from task name.
	// E.g. a task named "tast.critical-system" may have a test case
	// named "tast.audio.DevicePlay".
	// For tasks with a single test case it will generally be the same
	// as the task name, e.g. "logging_UserCrash".
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Verdict describes whether the test case passed, failed, or had
	// some other indefinite verdict.
	Verdict test_platform.TaskState_Verdict `protobuf:"varint,2,opt,name=verdict,proto3,enum=test_platform.TaskState_Verdict" json:"verdict,omitempty"`
	// A one line human readable description of what happened during
	// test case execution (e.g. error/warning message). Not intended
	// to be machine parseable. There's no guarantee that a given root
	// cause will always resolve to the same summary.
	HumanReadableSummary string   `protobuf:"bytes,3,opt,name=human_readable_summary,json=humanReadableSummary,proto3" json:"human_readable_summary,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ExecuteResponse_TaskResult_TestCaseResult proto.InternalMessageInfo

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

func (m *ExecuteResponse_TaskResult_TestCaseResult) GetVerdict() test_platform.TaskState_Verdict {
	if m != nil {
		return m.Verdict
	}
	return test_platform.TaskState_VERDICT_UNSPECIFIED
}

func (m *ExecuteResponse_TaskResult_TestCaseResult) GetHumanReadableSummary() string {
	if m != nil {
		return m.HumanReadableSummary
	}
	return ""
}

type ExecuteResponse_ConsolidatedResult struct {
	// result for each attempt of the corresponding enumeration.
	Attempts             []*ExecuteResponse_TaskResult `protobuf:"bytes,1,rep,name=attempts,proto3" json:"attempts,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                      `json:"-"`
	XXX_unrecognized     []byte                        `json:"-"`
	XXX_sizecache        int32                         `json:"-"`
}

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

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

var xxx_messageInfo_ExecuteResponse_ConsolidatedResult proto.InternalMessageInfo

func (m *ExecuteResponse_ConsolidatedResult) GetAttempts() []*ExecuteResponse_TaskResult {
	if m != nil {
		return m.Attempts
	}
	return nil
}

func init() {
	proto.RegisterType((*ExecuteRequests)(nil), "test_platform.steps.ExecuteRequests")
	proto.RegisterMapType((map[string]*ExecuteRequest)(nil), "test_platform.steps.ExecuteRequests.TaggedRequestsEntry")
	proto.RegisterType((*ExecuteResponses)(nil), "test_platform.steps.ExecuteResponses")
	proto.RegisterMapType((map[string]*ExecuteResponse)(nil), "test_platform.steps.ExecuteResponses.TaggedResponsesEntry")
	proto.RegisterType((*ExecuteRequest)(nil), "test_platform.steps.ExecuteRequest")
	proto.RegisterType((*ExecuteResponse)(nil), "test_platform.steps.ExecuteResponse")
	proto.RegisterType((*ExecuteResponse_TaskResult)(nil), "test_platform.steps.ExecuteResponse.TaskResult")
	proto.RegisterMapType((map[string]string)(nil), "test_platform.steps.ExecuteResponse.TaskResult.RejectedTaskDimensionsEntry")
	proto.RegisterType((*ExecuteResponse_TaskResult_TestCaseResult)(nil), "test_platform.steps.ExecuteResponse.TaskResult.TestCaseResult")
	proto.RegisterType((*ExecuteResponse_ConsolidatedResult)(nil), "test_platform.steps.ExecuteResponse.ConsolidatedResult")
}

func init() {
	proto.RegisterFile("test_platform/steps/execution.proto", fileDescriptor_54d6d12c45be2188)
}

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