// Code generated by protoc-gen-go. DO NOT EDIT.
// source: test/plan/v1/plan.proto

package plan

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	api "go.chromium.org/chromiumos/config/go/api"
	v1 "go.chromium.org/chromiumos/infra/proto/go/test/fleet/v1"
	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 Exclusion_Type int32

const (
	// Do not use.
	Exclusion_TYPE_UNSPECIFIED Exclusion_Type = 0
	// There are no active plans to remove these exclusions becuase it is
	// prohibitive to fix the issue or business needs do not justify the effort
	// to fix the issue.
	//
	// Each PERMANENT exclusion MUST include references that point to a business
	// justification for its addition.
	Exclusion_PERMANENT Exclusion_Type = 1
	// Use for excluding new tests from running on devices where the test has
	// not yet been stabilized. The intention is to support incremental rollout
	// of new tests.
	//
	// These exclsusion are temporary. These exclusions SHOULD be routinely
	// audited and resolved or promoted to PERMANENT exclusions.
	Exclusion_TEMPORARY_NEW_TEST Exclusion_Type = 2
	// Use for excluding broken / flakey tests while a fix is being worked on.
	//
	// These exclsusion are temporary. These exclusions SHOULD be routinely
	// audited and resolved or promoted to PERMANENT exclusions.
	Exclusion_TEMPORARY_PENDING_FIX Exclusion_Type = 3
)

var Exclusion_Type_name = map[int32]string{
	0: "TYPE_UNSPECIFIED",
	1: "PERMANENT",
	2: "TEMPORARY_NEW_TEST",
	3: "TEMPORARY_PENDING_FIX",
}

var Exclusion_Type_value = map[string]int32{
	"TYPE_UNSPECIFIED":      0,
	"PERMANENT":             1,
	"TEMPORARY_NEW_TEST":    2,
	"TEMPORARY_PENDING_FIX": 3,
}

func (x Exclusion_Type) String() string {
	return proto.EnumName(Exclusion_Type_name, int32(x))
}

func (Exclusion_Type) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_1a74b4d4119f628f, []int{5, 0}
}

// A set of known test plans.
//
// In practice, a complete specification of all known plans may consist of
// multiple Specification instances. In that case the plan names MUST be unique
// across different Specification instances.
type Specification struct {
	Plans                []*Plan  `protobuf:"bytes,1,rep,name=plans,proto3" json:"plans,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Specification proto.InternalMessageInfo

func (m *Specification) GetPlans() []*Plan {
	if m != nil {
		return m.Plans
	}
	return nil
}

// A Plan fully specifies a Test Platform end-user's coverage needs.
//
// Plans SHOULD associate platform software and Device Under Test condition
// coverage rules with tests that exercise those components. Plans MUST be used
// in the Test Platform request API. Other Test Lab Environments may use plans
// to ease interoperation with the Test Platform.
type Plan struct {
	// A globally unique test plan name.
	//
	// MUST be valid resource name per https://aip.dev/122.
	//
	// Pattern: plans/{plan}
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Each test plan unit specifies a particular set of tests to be run to meet
	// specific conditions.
	Units                []*Unit  `protobuf:"bytes,2,rep,name=units,proto3" json:"units,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Plan proto.InternalMessageInfo

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

func (m *Plan) GetUnits() []*Unit {
	if m != nil {
		return m.Units
	}
	return nil
}

// Specifies a particular set of tests to be run to meet specific conditions.
type Unit struct {
	// A globally unique test plan unit name.
	//
	// MUST be valid resource name per https://aip.dev/122.
	//
	// Pattern: plans/{plan}/units/{unit}
	//   where {plan} is the parent Plan of this Unit.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Selects tests to include in this test plan unit.
	//
	// See also: exclusions.
	TestConstraint *TestConstraint `protobuf:"bytes,2,opt,name=test_constraint,json=testConstraint,proto3" json:"test_constraint,omitempty"`
	// Selects the set of Devices Under Test that satisfy the coverage
	// requirements of this test plan unit.
	//
	// See also: exclusions.
	DutCoverageConstraint *DUTCoverageConstraint `protobuf:"bytes,3,opt,name=dut_coverage_constraint,json=dutCoverageConstraint,proto3" json:"dut_coverage_constraint,omitempty"`
	// Chrome OS platform software covered by this test plan.
	//
	// Test Platform requests may optionally include a reference to platform
	// software to be tested via the test plan. For such requests, Test Platform
	// MUST only execute test plan units that have non-trivial coverage of the
	// referenced platform software. Unrelated test plan units MUST be skipped.
	//
	// A typical example is presubmit testing: When testing a change to the
	// network manager, it may be desirable to only run test plan units that
	// are known to exercise the network manager.
	//
	// For a test plan unit with no `code_coverage` specified, Test Platform MUST
	// assume coverage of all platform software (i.e., this test plan unit MUST
	// never be skipped for code coverage considerations).
	CodeCoverage *CodeCoverage `protobuf:"bytes,4,opt,name=code_coverage,json=codeCoverage,proto3" json:"code_coverage,omitempty"`
	// A list of criteria for (test, Device Under Test) pairs that MUST be
	// excluded from this test plan.
	//
	// Exclusions are used to record exceptions to the test plan specification for
	// devices that are known to cause test failures for some temporary or
	// permanent reasons. The test_constraint and dut_coverage_constraint fields
	// together specify the _intent_ of the test plan unit. The exclusions further
	// restrict what Devices Under Test can be used to satisfy the test plan unit
	// due to practical considerations.
	//
	// Each exclusion SHOULD correspond to a different business reason.
	// Conceptually, fixing a known issue should result in an exclusion being
	// removed.
	Exclusions           []*Exclusion `protobuf:"bytes,5,rep,name=exclusions,proto3" json:"exclusions,omitempty"`
	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
	XXX_unrecognized     []byte       `json:"-"`
	XXX_sizecache        int32        `json:"-"`
}

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

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

var xxx_messageInfo_Unit proto.InternalMessageInfo

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

func (m *Unit) GetTestConstraint() *TestConstraint {
	if m != nil {
		return m.TestConstraint
	}
	return nil
}

func (m *Unit) GetDutCoverageConstraint() *DUTCoverageConstraint {
	if m != nil {
		return m.DutCoverageConstraint
	}
	return nil
}

func (m *Unit) GetCodeCoverage() *CodeCoverage {
	if m != nil {
		return m.CodeCoverage
	}
	return nil
}

func (m *Unit) GetExclusions() []*Exclusion {
	if m != nil {
		return m.Exclusions
	}
	return nil
}

// Selects the test.metadata.Test to include in a test plan unit.
type TestConstraint struct {
	// A Common Expression Language (CEL) expression to specify set of tests that
	// are included in a test plan unit.
	//
	// Test Platform MUST effectively evaluate `expression` with the following
	// declarations in scope for every test and include the test for which
	// `expression` evaluates to true in the test plan unit.
	//
	// - Constant: `test` of type TestConstraint.Test defined below,
	//   populated with metadata for a particular test.
	//
	// The full CEL spec can be found at https://github.com/google/cel-spec.
	//
	// TODO(crbug.com/1051689) Add reference to the metadata validator package.
	//
	// ## Examples
	//
	// Typical instructive examples of expressions are:
	//
	// - Tauto dummy tests
	//     "suite:dummy" in test.attributes
	// - Tast's crosbolt tests
	//     !("disabled" in test.attributes)
	//     && "group:crosbolt" in test.attributes
	//     && "crosbolt_perbuild" in test.attributes
	// - network Tauto tests, selected by name
	//     test.name.startsWith("network_")
	//
	// ## CEL support
	//
	// All standard CEL syntax, macros and functions MUST be supported.
	Expression           string   `protobuf:"bytes,1,opt,name=expression,proto3" json:"expression,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_TestConstraint proto.InternalMessageInfo

func (m *TestConstraint) GetExpression() string {
	if m != nil {
		return m.Expression
	}
	return ""
}

type TestConstraint_Test struct {
	// Name of the test as specified in test.metadata.Test.name
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// The test attribute name as specified in the test.metadata.Attribute.name
	//
	// attributes are populated from test.metadata.Test.attributes.
	Attributes           []string `protobuf:"bytes,2,rep,name=attributes,proto3" json:"attributes,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_TestConstraint_Test proto.InternalMessageInfo

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

func (m *TestConstraint_Test) GetAttributes() []string {
	if m != nil {
		return m.Attributes
	}
	return nil
}

// Selects sets of Devices Under Test to run the tests on in a test plan unit.
type DUTCoverageConstraint struct {
	// A Common Expression Language (CEL) expression to specify set of DUTs that
	// provide the necessary coverage. `expression` MUST evaluate to a boolean
	// value in the evaluation context described below.
	//
	// Test Platform MUST support scheduling test requests on a set of Devices
	// Under Test that satisfy some constraints on their Chrome OS configuration.
	//
	// Test Platform MUST effectively evaluate `expression` with the following
	// declarations in scope for each possible subset of Devices Under Test and
	// ensure that the test is scheduled on a set of Devices Under Test for which
	// `expression` evaluates to true.
	//
	// - Constant: `duts` of type repeated DUTConfigConstraint.DUT defined below,
	//   each entry in `duts` set to the Chrome OS configuration payload of a
	//   particular Device Under Test.
	// - Types: Protobuf messages from `chromiumos.config.api.*`
	//   - Additionally available with the short-hand `api.*`
	// - Types: Protobuf messages from `test.fleet.v1.*`
	//   - Additionally available with the short-hand `fleet.*`
	//
	// The full CEL spec can be found at https://github.com/google/cel-spec.
	// This API only supports a sub-set of the CEL features as described here.
	// Test Platform MUST validate the expression and reject use of unsupported
	// features.
	//
	// TODO(crbug.com/1051689) Add reference to the metadata validator package.
	//
	// ## Examples
	//
	// Typical instructive examples of expressions are:
	//
	// - Constraints: All pre-F20 plans only specify constraints on what devices
	//   may be used, e.g.:
	//    - Run each test on one DUT with model 'nautilus'.
	//        TODO(pprabhu, shapiroc): Need a way to specify model for migration.
	//        duts.all(dut, dut.id.model_id.value = 'nautilus') && size(duts) == 1
	//    - Run each test on one DUT with a stylus.
	//        (duts.all(dut, dut.hardware_features.stylus
	//                       == api.HardwareFeatures.Present.PRESENT))
	//         && size(duts) == 1)
	//  - Fanout (not yet supported): In addition to constraints, the
	//    plan may want to ensure coverage across some device features.
	//    TODO(pprabhu) This is an instructive example. We can't say what arch
	//    yet.
	//    - Run each test on one x86 and ARM DUT with a specific camera.
	//        (duts.all(dut, dut.hardware_toplogy.camera.id != "gomoe")
	//         && duts.exist(dut,
	//                       dut.cpu = api.Component.Soc.Architecture.X86)
	//         && duts.exist(dut,
	//                       dut.cpu = api.Component.Soc.Architecture.ARM))
	//      Note that this expression does not have a clause for size(duts). Thus
	//      Test Platform may satisfy this expression by running the test on more
	//      than two DUTs. This behaviour can be unexpected, especially if the
	//      plan fails due to an error on test execution on one of the selected
	//      devices, even though it passed on other devices in the set such that
	//      the expression was satsifed by the passing subset. Selection of a
	//      minimal set of devices to run the plan is best effort.
	//
	// Currently, only single-DUT constraints are supported by the Test Platform.
	// i.e., `expression` MUST be of the form:
	//   duts.all(DUT_SELECTOR) && size(duts) == 1
	// where DUT_SELECTOR is an expression that does not refer to `duts`.
	// This restriction will be lifted as this API matures.
	//
	// ## CEL support
	//
	// The full CEL spec can be found at https://github.com/google/cel-spec.
	//
	// Current support for `expression` evaluation is very restricted due to
	// limitations in the scheduling infrastructure used by Test Platform.
	//
	// As this API matures, features will be added to the scheduling
	// infrastructure of Test Platform and restrictions here will be lifted based
	// on requirements collected from test authors. See milestones in
	// go/cros-f20-plan for expected feature iterations. Test Lab Environments
	// SHOULD validate the expression and reject use of unsupported features.
	//
	// TODO(crbug.com/1051689) Add reference to the metadata validator package.
	//
	// ### Syntax
	//
	// See full syntax definition at
	// https://github.com/google/cel-spec/blob/master/doc/langdef.md#syntax
	//
	// CEL standard syntax allows expressions that evaluate to errors (e.g.,
	// syntax allows negation of lists, which has no semantics in CEL).
	// Thus, this spec does not attempt to restrict the syntax, but specifies what
	// operations are unsupported to aid metadata producers. Ultimately, the
	// reference metadata validator is the authority on what expressions are
	// allowed.
	//
	// Unsupported standard CEL semantics:
	//   - Binary arithmetic operations
	//     e.g.: +, *, /, % ...
	//   - Relational Operators beyond (in)equality are not supported.
	//     e.g.: (>, <, >=, <= ...)
	//   - Logical OR in expressions is not supported.
	//     e.g.: (a || b), !(a && b) ...
	//
	// ### Macros
	//
	// See full macro definition at
	// https://github.com/google/cel-spec/blob/master/doc/langdef.md#macros
	//
	// Supported macros: has(), e.all()
	// Unsupported macros: e.exists(), e.exists_one(), e.map(), e.filter()
	//
	// ### Standard functions
	//
	// See full list of standard definitions at
	// https://github.com/google/cel-spec/blob/master/doc/langdef.md#standard-definitions
	//
	// Most standard functions are not supported.
	//
	// - Supported operators: !_, -_, _!=_, _&&_, _=_, _[_]
	//   - All other operators are not supported.
	// - All other standard functions are not supported. In particular:
	//   - size() is not supported.
	//   - string functions like endsWith() and contains() are not supported.
	//   - type conversions like int() and string() are not supported.
	//   - reflection with type(), null_type() and dyn() is not supported.
	Expression           string   `protobuf:"bytes,1,opt,name=expression,proto3" json:"expression,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_DUTCoverageConstraint proto.InternalMessageInfo

func (m *DUTCoverageConstraint) GetExpression() string {
	if m != nil {
		return m.Expression
	}
	return ""
}

// The evaluation context for `expression` MUST include the Chrome OS
// configuration payload for a set of Devices Under Test as a typed
// constant of the following type.
//
//   repeated DUT duts = 1;
//
type DUTCoverageConstraint_DUT struct {
	// Configuration information about the lab deployment of the device.
	FleetDut             *v1.DeviceUnderTest   `protobuf:"bytes,1,opt,name=fleet_dut,json=fleetDut,proto3" json:"fleet_dut,omitempty"`
	HardwareFeatures     *api.HardwareFeatures `protobuf:"bytes,2,opt,name=hardware_features,json=hardwareFeatures,proto3" json:"hardware_features,omitempty"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

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

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

var xxx_messageInfo_DUTCoverageConstraint_DUT proto.InternalMessageInfo

func (m *DUTCoverageConstraint_DUT) GetFleetDut() *v1.DeviceUnderTest {
	if m != nil {
		return m.FleetDut
	}
	return nil
}

func (m *DUTCoverageConstraint_DUT) GetHardwareFeatures() *api.HardwareFeatures {
	if m != nil {
		return m.HardwareFeatures
	}
	return nil
}

// Exlclusion is used to record exceptions to the test plan
// specification for devices that are known to cause test failures for some
// temporary or permanent reasons.
type Exclusion struct {
	// Required.
	Type Exclusion_Type `protobuf:"varint,1,opt,name=type,proto3,enum=test.plan.v1.Exclusion_Type" json:"type,omitempty"`
	// The tests this exclusion applies to, within a test plan unit.
	//
	// Tests selected by this condition that are not in the test plan unit are
	// ignored. e.g., simply selecting all tests via the test_constraint will
	// apply this exclusion to all tests in the test plan unit.
	TestConstraint *TestConstraint `protobuf:"bytes,2,opt,name=test_constraint,json=testConstraint,proto3" json:"test_constraint,omitempty"`
	// Constraints to exclude particular Device Under Test from being considered
	// to satisfy the test plan.
	//
	// Effectively, the negation of the constraint is added to the dut_constraints
	// for each selected test.
	DutConstraint *DUTExclusionConstraint `protobuf:"bytes,3,opt,name=dut_constraint,json=dutConstraint,proto3" json:"dut_constraint,omitempty"`
	// External references useful for archeology for this exclusion.
	//
	// PERMANENT exclusions MUST add references for the decision to make the
	// exclusion PERMANENT.
	//
	// References should be links with more context behind the decision.
	// Suggested forms:
	// * Monorail bug: https://bugs.chromium.org/p/chromium/issues/detail?id=XXX
	// * Buganizer bug: https://b.corp.google.com/issues/XXX
	References           []string `protobuf:"bytes,4,rep,name=references,proto3" json:"references,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Exclusion proto.InternalMessageInfo

func (m *Exclusion) GetType() Exclusion_Type {
	if m != nil {
		return m.Type
	}
	return Exclusion_TYPE_UNSPECIFIED
}

func (m *Exclusion) GetTestConstraint() *TestConstraint {
	if m != nil {
		return m.TestConstraint
	}
	return nil
}

func (m *Exclusion) GetDutConstraint() *DUTExclusionConstraint {
	if m != nil {
		return m.DutConstraint
	}
	return nil
}

func (m *Exclusion) GetReferences() []string {
	if m != nil {
		return m.References
	}
	return nil
}

// Conditions to be met for the Chrome OS configuration of a Device Under
// Test for it to be excluded from consideration to satisfy a test plan unit.
type DUTExclusionConstraint struct {
	// A Common Expression Language (CEL) expression to specify constraints on a
	// Device Under Test's Chrome OS configuration payload. `expression` MUST
	// evaluate to a boolean value in the evaluation context described below.
	//
	// Test Lab Environments may optionally support excluding specific Devices
	// Under Test from being considered for a test plan unit.
	// When supported, the Test Lab Environment MUST effectively evaluate
	// `expression` with the following declarations in scope for each available
	// Device Under Test and ensure that the test is *not* scheduled on a Device
	// Under Test for which `expression` evaluates to true.
	//
	// - Constant: `dut` of type DUTConfigConstraint.DUT defined below, set to the
	//   Chrome OS configuration payload of a particular Device Under Test.
	// - Types: Protobuf messages from `chromiumos.config.api.*`
	//   - Additionally available with the short-hand `api.*`
	//
	// ## Examples
	//
	// Typical examples of expressions are:
	//
	// - Must not run on a device with a given screen size:
	//     dut.hardware_features.screen.milliinch.value == 14000
	// - TODO: Add model / build target example.
	//
	// ## CEL support
	//
	// The full CEL spec can be found at https://github.com/google/cel-spec.
	//
	// Current support for `expression` evaluation is very restricted due to
	// limitations in the scheduling infrastructure used by Test Platform.
	//
	// As this API matures, features will be added to the scheduling
	// infrastructure of Test Platform and restrictions here will be lifted based
	// on requirements collected from test authors. See milestones in
	// go/cros-f20-plan for expected feature iterations. Test Lab Environments
	// SHOULD validate the expression and reject use of unsupported features.
	//
	// TODO(crbug.com/1051689) Add reference to the metadata validator package.
	//
	// ### Syntax
	//
	// See full syntax definition at
	// https://github.com/google/cel-spec/blob/master/doc/langdef.md#syntax
	//
	// CEL standard syntax allows expressions that evaluate to errors (e.g.,
	// syntax allows negation of lists, which has no semantics in CEL).
	// Thus, this spec does not attempt to restrict the syntax, but specifies what
	// operations are unsupported to aid metadata producers. Ultimately, the
	// reference metadata validator is the authority on what expressions are
	// allowed.
	//
	// Unsupported standard CEL semantics:
	//   - Binary arithmetic operations
	//     e.g.: +, *, /, % ...
	//   - Relational Operators beyond (in)equality are not supported.
	//     e.g.: (>, <, >=, <= ...)
	//   - Logical OR in expressions is not supported.
	//     e.g.: (a || b), !(a && b) ...
	//
	// ### Macros
	//
	// See full macro definition at
	// https://github.com/google/cel-spec/blob/master/doc/langdef.md#macros
	//
	// Supported macros: has(), e.all()
	// Unsupported macros: e.exists(), e.exists_one(), e.map(), e.filter()
	//
	// ### Standard functions
	//
	// See full list of standard definitions at
	// https://github.com/google/cel-spec/blob/master/doc/langdef.md#standard-definitions
	//
	// Most standard functions are not supported.
	//
	// - Supported operators: !_, -_, _!=_, _&&_, _=_, _[_]
	//   - All other operators are not supported.
	// - All other standard functions are not supported. In particular:
	//   - size() is not supported.
	//   - string functions like endsWith() and contains() are not supported.
	//   - type conversions like int() and string() are not supported.
	//   - reflection with type(), null_type() and dyn() is not supported.
	Expression           string   `protobuf:"bytes,1,opt,name=expression,proto3" json:"expression,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_DUTExclusionConstraint proto.InternalMessageInfo

func (m *DUTExclusionConstraint) GetExpression() string {
	if m != nil {
		return m.Expression
	}
	return ""
}

// The evaluation context for `expression` MUST include the Chrome OS
// configuration payload for a particular Device Under Test as a typed
// constant of the following type.
type DUTExclusionConstraint_DUT struct {
	HardwareFeatures     *api.HardwareFeatures `protobuf:"bytes,1,opt,name=hardware_features,json=hardwareFeatures,proto3" json:"hardware_features,omitempty"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

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

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

var xxx_messageInfo_DUTExclusionConstraint_DUT proto.InternalMessageInfo

func (m *DUTExclusionConstraint_DUT) GetHardwareFeatures() *api.HardwareFeatures {
	if m != nil {
		return m.HardwareFeatures
	}
	return nil
}

// Specifies platforms software covered by a test plan unit.
type CodeCoverage struct {
	// A Common Expression Language (CEL) expression to specify Chrome OS platform
	// sources covered by a test plan unit.
	//
	// Test Platform may optionally support skipping test plan units that are not
	// applicable for incoming changes to Chrome OS. If this feature is supported,
	// and if a non-empty blamelist is available, Test Platform MUST effectively
	// evaluate `expression` with the following declarations in scope for the
	// blamelist only include the test plan unit if the `expression` evaluates to
	// true.
	//
	// - Constant: `blamelist` of type CodeCoverage.Blamelist defined below,
	//   populated with blamelist attached to the request, if blamelist is
	//   non-empty.
	//
	// The full CEL spec can be found at https://github.com/google/cel-spec.
	//
	// TODO(crbug.com/1051689) Add reference to the metadata validator package.
	//
	// ## Examples
	//
	// Typical instructive examples of expressions are:
	//
	// - Only include test plan unit if there are changes to chromite
	//     blamelist.repo_paths.exists(p, p.startsWith("chromite"))
	// - Only include test plan unit if there are changes to chromite or autotest
	//     blamelist.repo_paths.exists(p, [
	//         "src/third_party/autotest/files",
	//         "chromite"
	//       ].exists(s, p.startsWith(s)))
	// - Do not include test plan unit if there are changes to private overlays
	//     blamelist.repo_paths.all(p, !p.contains("private-overlays"))
	//
	// ## CEL support
	//
	// All standard CEL syntax, macros and functions MUST be supported.
	Expression           string   `protobuf:"bytes,1,opt,name=expression,proto3" json:"expression,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *CodeCoverage) Reset()         { *m = CodeCoverage{} }
func (m *CodeCoverage) String() string { return proto.CompactTextString(m) }
func (*CodeCoverage) ProtoMessage()    {}
func (*CodeCoverage) Descriptor() ([]byte, []int) {
	return fileDescriptor_1a74b4d4119f628f, []int{7}
}

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

var xxx_messageInfo_CodeCoverage proto.InternalMessageInfo

func (m *CodeCoverage) GetExpression() string {
	if m != nil {
		return m.Expression
	}
	return ""
}

type CodeCoverage_Blamelist struct {
	// Changed paths (usually directories) in a typical checkout of the Chrome
	// OS source tree.
	//
	// Paths are relative to `repo` root. e.g., `src/platform2/shill`.
	RepoPaths            []string `protobuf:"bytes,1,rep,name=repo_paths,json=repoPaths,proto3" json:"repo_paths,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_CodeCoverage_Blamelist proto.InternalMessageInfo

func (m *CodeCoverage_Blamelist) GetRepoPaths() []string {
	if m != nil {
		return m.RepoPaths
	}
	return nil
}

func init() {
	proto.RegisterEnum("test.plan.v1.Exclusion_Type", Exclusion_Type_name, Exclusion_Type_value)
	proto.RegisterType((*Specification)(nil), "test.plan.v1.Specification")
	proto.RegisterType((*Plan)(nil), "test.plan.v1.Plan")
	proto.RegisterType((*Unit)(nil), "test.plan.v1.Unit")
	proto.RegisterType((*TestConstraint)(nil), "test.plan.v1.TestConstraint")
	proto.RegisterType((*TestConstraint_Test)(nil), "test.plan.v1.TestConstraint.Test")
	proto.RegisterType((*DUTCoverageConstraint)(nil), "test.plan.v1.DUTCoverageConstraint")
	proto.RegisterType((*DUTCoverageConstraint_DUT)(nil), "test.plan.v1.DUTCoverageConstraint.DUT")
	proto.RegisterType((*Exclusion)(nil), "test.plan.v1.Exclusion")
	proto.RegisterType((*DUTExclusionConstraint)(nil), "test.plan.v1.DUTExclusionConstraint")
	proto.RegisterType((*DUTExclusionConstraint_DUT)(nil), "test.plan.v1.DUTExclusionConstraint.DUT")
	proto.RegisterType((*CodeCoverage)(nil), "test.plan.v1.CodeCoverage")
	proto.RegisterType((*CodeCoverage_Blamelist)(nil), "test.plan.v1.CodeCoverage.Blamelist")
}

func init() { proto.RegisterFile("test/plan/v1/plan.proto", fileDescriptor_1a74b4d4119f628f) }

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