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

package analytics

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	timestamp "github.com/golang/protobuf/ptypes/timestamp"
	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

// TestPlanRun represents the test request defined by users and its running
// status.
type TestPlanRun struct {
	// A unique name to identify this test plan run, format
	// "testPlanRuns/CTP_BUILD_ID/REQ_KEY", where REQ_KEY is the CTP
	// request’s key in the multiple-request,
	// e.g. "testPlanRuns/8879199769272202448/octopus_ampton"
	// Required field.
	Uid string `protobuf:"bytes,1,opt,name=uid,proto3" json:"uid,omitempty"`
	// CTP build ID.
	BuildId int64 `protobuf:"varint,2,opt,name=build_id,json=buildId,proto3" json:"build_id,omitempty"`
	// Suite name. If the test plan is running an autotest suite,
	// this field is the autotest suite name, e.g. wifi_interop.
	Suite string `protobuf:"bytes,3,opt,name=suite,proto3" json:"suite,omitempty"`
	// Human friendly url to access this run.
	ExecutionUrl string `protobuf:"bytes,4,opt,name=execution_url,json=executionUrl,proto3" json:"execution_url,omitempty"`
	// The dut_pool in which the test plan ran, e.g. "DUT_POOL_QUOTA" or
	// "wificell".
	// It is case sensitive: "WIFICELL" and "wificell" represent different
	// pools.
	// Note that legacy pools "suites", "bvt" and "pcq" have been integrated
	// into "DUT_POOL_QUOTA" and legacy pool "cts" has been renamed to
	// "DUT_POOL_CTS".
	DutPool string `protobuf:"bytes,5,opt,name=dut_pool,json=dutPool,proto3" json:"dut_pool,omitempty"`
	// The build target, a.k.a board name, e.g. "hatch", "octopus".
	BuildTarget string `protobuf:"bytes,6,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	// CrOS build version, e.g. "R84/13091.0.0".
	ChromeosBuild string  `protobuf:"bytes,7,opt,name=chromeos_build,json=chromeosBuild,proto3" json:"chromeos_build,omitempty"`
	Status        *Status `protobuf:"bytes,8,opt,name=status,proto3" json:"status,omitempty"`
	// Event timestamp of test plan run, e.g. start time, end time.
	Timeline             *Timeline `protobuf:"bytes,9,opt,name=timeline,proto3" json:"timeline,omitempty"`
	XXX_NoUnkeyedLiteral struct{}  `json:"-"`
	XXX_unrecognized     []byte    `json:"-"`
	XXX_sizecache        int32     `json:"-"`
}

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

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

var xxx_messageInfo_TestPlanRun proto.InternalMessageInfo

func (m *TestPlanRun) GetUid() string {
	if m != nil {
		return m.Uid
	}
	return ""
}

func (m *TestPlanRun) GetBuildId() int64 {
	if m != nil {
		return m.BuildId
	}
	return 0
}

func (m *TestPlanRun) GetSuite() string {
	if m != nil {
		return m.Suite
	}
	return ""
}

func (m *TestPlanRun) GetExecutionUrl() string {
	if m != nil {
		return m.ExecutionUrl
	}
	return ""
}

func (m *TestPlanRun) GetDutPool() string {
	if m != nil {
		return m.DutPool
	}
	return ""
}

func (m *TestPlanRun) GetBuildTarget() string {
	if m != nil {
		return m.BuildTarget
	}
	return ""
}

func (m *TestPlanRun) GetChromeosBuild() string {
	if m != nil {
		return m.ChromeosBuild
	}
	return ""
}

func (m *TestPlanRun) GetStatus() *Status {
	if m != nil {
		return m.Status
	}
	return nil
}

func (m *TestPlanRun) GetTimeline() *Timeline {
	if m != nil {
		return m.Timeline
	}
	return nil
}

// TestRun contains Skylab task level information.
type TestRun struct {
	// Test runner build ID.
	BuildId int64 `protobuf:"varint,1,opt,name=build_id,json=buildId,proto3" json:"build_id,omitempty"`
	// The name of the Skylab task corresponding to the test run, e.g.
	// "tast.critical-chrome".
	//
	// For tasks containing a single test case, will generally be the same as the
	// name of that test case, e.g. "provision_AutoUpdate.double".
	// Required field.
	DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"`
	// Human friendly url to access this run.
	ExecutionUrl string `protobuf:"bytes,3,opt,name=execution_url,json=executionUrl,proto3" json:"execution_url,omitempty"`
	// The TestPlanRun.uid of the parent test plan run.
	ParentUid string `protobuf:"bytes,4,opt,name=parent_uid,json=parentUid,proto3" json:"parent_uid,omitempty"`
	// Model name, e.g. "helios", "mimrock".
	// Note that a single TestPlanRun may be spread across multiple models, if
	// the test plan request did not specify a model to run.
	Model string `protobuf:"bytes,5,opt,name=model,proto3" json:"model,omitempty"`
	// Event timestamp of test run, e.g. start time, end time.
	Timeline *Timeline `protobuf:"bytes,6,opt,name=timeline,proto3" json:"timeline,omitempty"`
	Status   *Status   `protobuf:"bytes,7,opt,name=status,proto3" json:"status,omitempty"`
	Verdict  *Verdict  `protobuf:"bytes,8,opt,name=verdict,proto3" json:"verdict,omitempty"`
	// The URL for the entire logs of this run.
	FullLogUrl           string          `protobuf:"bytes,9,opt,name=full_log_url,json=fullLogUrl,proto3" json:"full_log_url,omitempty"`
	Prejob               *TestRun_Prejob `protobuf:"bytes,10,opt,name=prejob,proto3" json:"prejob,omitempty"`
	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
	XXX_unrecognized     []byte          `json:"-"`
	XXX_sizecache        int32           `json:"-"`
}

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

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

var xxx_messageInfo_TestRun proto.InternalMessageInfo

func (m *TestRun) GetBuildId() int64 {
	if m != nil {
		return m.BuildId
	}
	return 0
}

func (m *TestRun) GetDisplayName() string {
	if m != nil {
		return m.DisplayName
	}
	return ""
}

func (m *TestRun) GetExecutionUrl() string {
	if m != nil {
		return m.ExecutionUrl
	}
	return ""
}

func (m *TestRun) GetParentUid() string {
	if m != nil {
		return m.ParentUid
	}
	return ""
}

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

func (m *TestRun) GetTimeline() *Timeline {
	if m != nil {
		return m.Timeline
	}
	return nil
}

func (m *TestRun) GetStatus() *Status {
	if m != nil {
		return m.Status
	}
	return nil
}

func (m *TestRun) GetVerdict() *Verdict {
	if m != nil {
		return m.Verdict
	}
	return nil
}

func (m *TestRun) GetFullLogUrl() string {
	if m != nil {
		return m.FullLogUrl
	}
	return ""
}

func (m *TestRun) GetPrejob() *TestRun_Prejob {
	if m != nil {
		return m.Prejob
	}
	return nil
}

type TestRun_Prejob struct {
	Verdict              *Verdict `protobuf:"bytes,1,opt,name=verdict,proto3" json:"verdict,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_TestRun_Prejob proto.InternalMessageInfo

func (m *TestRun_Prejob) GetVerdict() *Verdict {
	if m != nil {
		return m.Verdict
	}
	return nil
}

// TestCaseResult describes the result of an individual test case.
type TestCaseResult struct {
	// A unique name for this test case run,
	// format "testCaseResults/TEST_RUNNER_BUILD_ID/TEST_CASE_NAME", e.g.
	// "testCaseResults/8879199769272202448/provision_AutoUpdate.double".
	// Required field.
	Uid string `protobuf:"bytes,1,opt,name=uid,proto3" json:"uid,omitempty"`
	// Test case name as it appears in status.log,
	// e.g. "provision_AutoUpdate.double".
	DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"`
	// The TestRun.build_id of the parent test run.
	ParentBuildId int64    `protobuf:"varint,3,opt,name=parent_build_id,json=parentBuildId,proto3" json:"parent_build_id,omitempty"`
	Verdict       *Verdict `protobuf:"bytes,4,opt,name=verdict,proto3" 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,5,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 *TestCaseResult) Reset()         { *m = TestCaseResult{} }
func (m *TestCaseResult) String() string { return proto.CompactTextString(m) }
func (*TestCaseResult) ProtoMessage()    {}
func (*TestCaseResult) Descriptor() ([]byte, []int) {
	return fileDescriptor_ea3c1349f87b947c, []int{2}
}

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

var xxx_messageInfo_TestCaseResult proto.InternalMessageInfo

func (m *TestCaseResult) GetUid() string {
	if m != nil {
		return m.Uid
	}
	return ""
}

func (m *TestCaseResult) GetDisplayName() string {
	if m != nil {
		return m.DisplayName
	}
	return ""
}

func (m *TestCaseResult) GetParentBuildId() int64 {
	if m != nil {
		return m.ParentBuildId
	}
	return 0
}

func (m *TestCaseResult) GetVerdict() *Verdict {
	if m != nil {
		return m.Verdict
	}
	return nil
}

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

// The timeline of a task.
type Timeline struct {
	// Time the task was requested.
	CreateTime *timestamp.Timestamp `protobuf:"bytes,1,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"`
	// Time the task began to execute in a bot.
	StartTime *timestamp.Timestamp `protobuf:"bytes,2,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"`
	// Time the task completed, unset if the task was
	// stopped unexpectedly before its completion.
	EndTime *timestamp.Timestamp `protobuf:"bytes,3,opt,name=end_time,json=endTime,proto3" json:"end_time,omitempty"`
	// Time the task was stopped unexpectedly, unset if
	// task has run to its end.
	AbandonTime          *timestamp.Timestamp `protobuf:"bytes,4,opt,name=abandon_time,json=abandonTime,proto3" json:"abandon_time,omitempty"`
	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
	XXX_unrecognized     []byte               `json:"-"`
	XXX_sizecache        int32                `json:"-"`
}

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

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

var xxx_messageInfo_Timeline proto.InternalMessageInfo

func (m *Timeline) GetCreateTime() *timestamp.Timestamp {
	if m != nil {
		return m.CreateTime
	}
	return nil
}

func (m *Timeline) GetStartTime() *timestamp.Timestamp {
	if m != nil {
		return m.StartTime
	}
	return nil
}

func (m *Timeline) GetEndTime() *timestamp.Timestamp {
	if m != nil {
		return m.EndTime
	}
	return nil
}

func (m *Timeline) GetAbandonTime() *timestamp.Timestamp {
	if m != nil {
		return m.AbandonTime
	}
	return nil
}

// The latest known status of a task, may change as the run progresses.
type Status struct {
	// All the currently possible values (corresponding to
	// testplatform.Taskstate.LifeCycle enum values):
	//   NORMAL STATUS:
	//
	//     PENDING: task is pending somewhere and does not run.
	//     RUNNING: task is running.
	//     COMPLETED: ran to completion without being cancelled externally,
	//       regardless of whether it succeeded or failed. A task is completed
	//       only if all its sub-tasks have reached the end, either with a normal
	//       or abnormal status.
	//
	//   ABNORMAL STATUS:
	//
	//     CANCELLED: never got a chance to run, cancelled externally.
	//     REJECTED: never got a chance to run, rejected due to unsatisfiable
	//       depenedencies.
	//     ABORTED: started running but was cancelled externally while running.
	Value                string   `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Status proto.InternalMessageInfo

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

// The known tokens describe whether a task passed, failed, or had some other
// indefinite verdict.
type Verdict struct {
	// All the currently possible values (corresponding to
	// testplatform.Taskstate.Verdict enum values):
	//
	//   UNSPECIFIED(default): the task produced no usable verdict (possibly
	//     because it never ran, or never finished, or the results were
	//     unparseable).
	//     Under most circumstances, this should be treated as a failure or
	//     an infrastructure failure.
	//   PASSED: test run definitively passed.
	//   FAILED: test run definitively failed.
	//   NO_VERDICT: the task definitively produced no verdict(for instance,
	//     the test is irrelevant in the given environment).
	//     Under most circumstances, this should be treated as a passing
	//     (but uninteresting).
	//   PASSED_ON_RETRY: the task failed, but passed after one or more retries.
	Value                string   `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Verdict proto.InternalMessageInfo

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

func init() {
	proto.RegisterType((*TestPlanRun)(nil), "test_platform.analytics.TestPlanRun")
	proto.RegisterType((*TestRun)(nil), "test_platform.analytics.TestRun")
	proto.RegisterType((*TestRun_Prejob)(nil), "test_platform.analytics.TestRun.Prejob")
	proto.RegisterType((*TestCaseResult)(nil), "test_platform.analytics.TestCaseResult")
	proto.RegisterType((*Timeline)(nil), "test_platform.analytics.Timeline")
	proto.RegisterType((*Status)(nil), "test_platform.analytics.Status")
	proto.RegisterType((*Verdict)(nil), "test_platform.analytics.Verdict")
}

func init() {
	proto.RegisterFile("test_platform/analytics/result.proto", fileDescriptor_ea3c1349f87b947c)
}

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