// Code generated by protoc-gen-go. DO NOT EDIT.
// source: go.chromium.org/luci/cq/api/config/v2/cq.proto

package config

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

// A boolean with an undefined value.
type Toggle int32

const (
	Toggle_UNSET Toggle = 0
	Toggle_YES   Toggle = 1
	Toggle_NO    Toggle = 2
)

var Toggle_name = map[int32]string{
	0: "UNSET",
	1: "YES",
	2: "NO",
}

var Toggle_value = map[string]int32{
	"UNSET": 0,
	"YES":   1,
	"NO":    2,
}

func (x Toggle) String() string {
	return proto.EnumName(Toggle_name, int32(x))
}

func (Toggle) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_59a2f489dbd601ec, []int{0}
}

// See `allow_owner_if_submittable` doc below.
type Verifiers_GerritCQAbility_CQAction int32

const (
	Verifiers_GerritCQAbility_UNSET   Verifiers_GerritCQAbility_CQAction = 0
	Verifiers_GerritCQAbility_DRY_RUN Verifiers_GerritCQAbility_CQAction = 1
	// COMMIT implies ability to trigger dry run as well.
	Verifiers_GerritCQAbility_COMMIT Verifiers_GerritCQAbility_CQAction = 2
)

var Verifiers_GerritCQAbility_CQAction_name = map[int32]string{
	0: "UNSET",
	1: "DRY_RUN",
	2: "COMMIT",
}

var Verifiers_GerritCQAbility_CQAction_value = map[string]int32{
	"UNSET":   0,
	"DRY_RUN": 1,
	"COMMIT":  2,
}

func (x Verifiers_GerritCQAbility_CQAction) String() string {
	return proto.EnumName(Verifiers_GerritCQAbility_CQAction_name, int32(x))
}

func (Verifiers_GerritCQAbility_CQAction) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_59a2f489dbd601ec, []int{4, 0, 0}
}

// This message describes a Commit Queue configuration.
//
// The config file commit-queue.cfg should be stored in the config directory of your
// project, alongside cr-buildbucket.cfg.
type Config struct {
	// Optional. If present, the CQ will refrain from processing any CLs,
	// on which CQ was triggered after the specified time.
	//
	// This is an UTC RFC3339 (stiptime(tm)) string representing the time.
	// For example, "2017-12-23T15:47:58Z" and Z is required.
	DrainingStartTime string `protobuf:"bytes,1,opt,name=draining_start_time,json=drainingStartTime,proto3" json:"draining_start_time,omitempty"`
	// Optional and deprecated.
	// URL of the CQ status app to push updates to.
	CqStatusHost string `protobuf:"bytes,2,opt,name=cq_status_host,json=cqStatusHost,proto3" json:"cq_status_host,omitempty"`
	// Optional options for how CLs should be submitted.
	SubmitOptions *SubmitOptions `protobuf:"bytes,3,opt,name=submit_options,json=submitOptions,proto3" json:"submit_options,omitempty"`
	// At least 1 ConfigGroup is required.
	ConfigGroups []*ConfigGroup `protobuf:"bytes,4,rep,name=config_groups,json=configGroups,proto3" json:"config_groups,omitempty"`
	// Toggles the use of project scoped account for Gerrit access.
	// UNSET = Disabled, subject to change in the future.
	// NO = Disabled.
	// YES = Enabled.
	ProjectScopedAccount Toggle   `protobuf:"varint,5,opt,name=project_scoped_account,json=projectScopedAccount,proto3,enum=cq.config.Toggle" json:"project_scoped_account,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Config proto.InternalMessageInfo

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

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

func (m *Config) GetSubmitOptions() *SubmitOptions {
	if m != nil {
		return m.SubmitOptions
	}
	return nil
}

func (m *Config) GetConfigGroups() []*ConfigGroup {
	if m != nil {
		return m.ConfigGroups
	}
	return nil
}

func (m *Config) GetProjectScopedAccount() Toggle {
	if m != nil {
		return m.ProjectScopedAccount
	}
	return Toggle_UNSET
}

// SubmitOptions control how CQ submits CLs.
type SubmitOptions struct {
	// Optional. Maximum number of successful CQ attempts completed by submitting
	// corresponding Gerrit CL(s) before waiting burst_delay.
	//
	// This feature today applies to all attempts processed by this CQ, across all
	// config_groups.
	//
	// Must be >0 to take effect. Requires burst_delay to be set, too.
	MaxBurst int32 `protobuf:"varint,1,opt,name=max_burst,json=maxBurst,proto3" json:"max_burst,omitempty"`
	// Optional. Delay between bursts of submissions of CQ attempts.
	// See max_burst for more info.
	//
	// Must be >0 to take effect. Requires max_burst to be set, too.
	BurstDelay           *duration.Duration `protobuf:"bytes,2,opt,name=burst_delay,json=burstDelay,proto3" json:"burst_delay,omitempty"`
	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
	XXX_unrecognized     []byte             `json:"-"`
	XXX_sizecache        int32              `json:"-"`
}

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

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

var xxx_messageInfo_SubmitOptions proto.InternalMessageInfo

func (m *SubmitOptions) GetMaxBurst() int32 {
	if m != nil {
		return m.MaxBurst
	}
	return 0
}

func (m *SubmitOptions) GetBurstDelay() *duration.Duration {
	if m != nil {
		return m.BurstDelay
	}
	return nil
}

// ConfigGroup allows one to share single verifiers config across a set of
// Gerrit repositories, which may be in different Gerrit installations.
type ConfigGroup struct {
	// At least 1 Gerrit instance with repositories to work with is required.
	Gerrit []*ConfigGroup_Gerrit `protobuf:"bytes,1,rep,name=gerrit,proto3" json:"gerrit,omitempty"`
	// Optional. If specified, CQ will consider sets of dependent CLs to test and
	// submit at the same time.
	//
	// Typical use-case is testing & submitting changes to multiple repos at the
	// same time, in which case all such repos must be declared up-front in
	// `Gerrit` part of this config_group.
	CombineCls *CombineCLs `protobuf:"bytes,4,opt,name=combine_cls,json=combineCls,proto3" json:"combine_cls,omitempty"`
	// Defines how to verify a CL before submitting it. Required.
	Verifiers *Verifiers `protobuf:"bytes,2,opt,name=verifiers,proto3" json:"verifiers,omitempty"`
	// EXPERIMENTAL! TODO(tandrii, crbug/966115): add better doc or remove.
	//
	// If set, this ConfigGroup will be used if no other ConfigGroup matches.
	//
	// At most 1 config_group can be YES.
	//
	// Example use is to define specific config_group for refs/heads/master,
	// and fallback one for refs/heads/* which will pick up all CLs on
	// non-master branches.
	Fallback             Toggle   `protobuf:"varint,5,opt,name=fallback,proto3,enum=cq.config.Toggle" json:"fallback,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ConfigGroup proto.InternalMessageInfo

func (m *ConfigGroup) GetGerrit() []*ConfigGroup_Gerrit {
	if m != nil {
		return m.Gerrit
	}
	return nil
}

func (m *ConfigGroup) GetCombineCls() *CombineCLs {
	if m != nil {
		return m.CombineCls
	}
	return nil
}

func (m *ConfigGroup) GetVerifiers() *Verifiers {
	if m != nil {
		return m.Verifiers
	}
	return nil
}

func (m *ConfigGroup) GetFallback() Toggle {
	if m != nil {
		return m.Fallback
	}
	return Toggle_UNSET
}

// Enumerates repositories on a Gerrit instance for which CQ should work.
type ConfigGroup_Gerrit struct {
	// Gerrit URL, e.g., https://chromium-review.googlesource.com.
	// No trailing slashes allowed.
	Url string `protobuf:"bytes,1,opt,name=url,proto3" json:"url,omitempty"`
	// Gerrit projects of this Gerrit instance to work with.
	//
	// At least 1 required.
	Projects             []*ConfigGroup_Gerrit_Project `protobuf:"bytes,2,rep,name=projects,proto3" json:"projects,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                      `json:"-"`
	XXX_unrecognized     []byte                        `json:"-"`
	XXX_sizecache        int32                         `json:"-"`
}

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

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

var xxx_messageInfo_ConfigGroup_Gerrit proto.InternalMessageInfo

func (m *ConfigGroup_Gerrit) GetUrl() string {
	if m != nil {
		return m.Url
	}
	return ""
}

func (m *ConfigGroup_Gerrit) GetProjects() []*ConfigGroup_Gerrit_Project {
	if m != nil {
		return m.Projects
	}
	return nil
}

type ConfigGroup_Gerrit_Project struct {
	// Repository name inside Gerrit host. Required.
	//
	// No leading or trailing slashes allowed, no '.git' at the end.
	// 'a/' prefix is also not allowed (it's used on *.googlesource.com for
	// forcing authentication).
	//
	// Examples on https://chromium-review.googlesource.com:
	//   catapult
	//   chromium/src
	//   chromium/tools/depot_tools
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Limit CLs in this repo to only these refs. Required.
	//
	// If not specified, defaults to "refs/heads/master".
	//
	// NOTE: your Gerrit admin must configure Gerrit ACLs such that CQ has
	// read access to these refs, otherwise your users will be waiting for CQ
	// to act on their CLs forever.
	//
	// Regular expression is validated by https://github.com/google/re2 library.
	//
	// NOTE: Git globs aren't supported. Convert them to a regular expression,
	// e.g., Git glob "refs/heads/*" should be "refs/heads/[^/]+".
	// However, users typically expect "refs/heads/.+", since expectation is
	// that every typical Git branch to be CQ-able, including
	// "refs/heads/experimental/foobar".
	RefRegexp            []string                                  `protobuf:"bytes,2,rep,name=ref_regexp,json=refRegexp,proto3" json:"ref_regexp,omitempty"`
	CrosMigration        *ConfigGroup_Gerrit_Project_CrOSMigration `protobuf:"bytes,3,opt,name=cros_migration,json=crosMigration,proto3" json:"cros_migration,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                  `json:"-"`
	XXX_unrecognized     []byte                                    `json:"-"`
	XXX_sizecache        int32                                     `json:"-"`
}

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

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

var xxx_messageInfo_ConfigGroup_Gerrit_Project proto.InternalMessageInfo

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

func (m *ConfigGroup_Gerrit_Project) GetRefRegexp() []string {
	if m != nil {
		return m.RefRegexp
	}
	return nil
}

func (m *ConfigGroup_Gerrit_Project) GetCrosMigration() *ConfigGroup_Gerrit_Project_CrOSMigration {
	if m != nil {
		return m.CrosMigration
	}
	return nil
}

// DO NOT USE. TODO(crbug/965615, tandrii): delete this.
// HACK(cbrug/965615). Only for CrOS during LUCI CQ migration.
type ConfigGroup_Gerrit_Project_CrOSMigration struct {
	// % of new CQ attempts which LUCI CQ will process itself.
	// The rest will be delegated to legacy CrOS CQ.
	// If not set, implies 0%, ie all CLs are delegated.
	// To set these per ref_regexp of a single repo, duplicate project{}
	// block for this repo but with diff regexp.
	LuciPercentage       float32  `protobuf:"fixed32,1,opt,name=luci_percentage,json=luciPercentage,proto3" json:"luci_percentage,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ConfigGroup_Gerrit_Project_CrOSMigration proto.InternalMessageInfo

func (m *ConfigGroup_Gerrit_Project_CrOSMigration) GetLuciPercentage() float32 {
	if m != nil {
		return m.LuciPercentage
	}
	return 0
}

// CombineCLs defines how CQ works with >1 CL per attempt.
//
// Dependencies between CLs are either implicit via Git child->parent
// relationship (e.g. stacked CLs in Gerrit) or explicit via "CQ-Depend:"
// footer in CL description (next to Change-Id:). "CQ-Depend" may span
// across repositories and even Gerrit hosts. For example, a CL on
// https://pdfium-review.googlesource.com may declare dependency on
// https://chromium-review.googlesource.com/1111111 by adding this footer:
//
//    CQ-Depend: chromium:1111111
//
// The "chromium" part means that 1111111 is on the
// chromium-review.googlesource.com host. It can be omitted if dependency
// is on the same host as the CL depending on it.
//
// CQ-Depend alone or with Git dependencies may form cycles, which is useful
// to require CQ to test & submit all CLs in a cycle at the same time, never
// alone.
//
// A user must vote on CQ label on **each CL** individually. Since it can't be
// instantaneous, `stabilization_delay` controls how long CQ waits for all
// CQ+1/2 votes before computing maximal expanded set of CLs and starting the
// attempt.
//
// For any CL with CQ+1/2 vote, each of its dependency must have the same CQ
// vote and be configured for CQ **in the same config group**, else CQ would
// abort the attempt with appropriate error message.
//
// Each tryjob CQ triggers via Buildbucket will be associated with each CL of
// the attempt via `gerrit_changes` parameter of Buildbucket. These changes are
// then available to a build as it is being executed. If ran via recipes,
// the `ordered_gerrit_changes` property of
// https://chromium.googlesource.com/infra/luci/recipes-py/+/HEAD/README.recipes.md#class-cqapi_recipeapi
// can be used to CLs in the right order.
//
// WARNING: When submitting CLs, CQ can not do so atomically (all submitted or
// none submitted) because Gerrit doesn't support this even for the same repo &
// target_ref.
type CombineCLs struct {
	// Roughly, how long CQ waits for CQ to be triggered on each of the related
	// CLs.
	//
	// Must be greater than 10s.
	// 30s is recommended.
	//
	// Technically precise definition is time to wait since the latest CL among
	// related ones receives CQ+1/2 vote before starting actual attempt.
	//
	// For example, during this delay, a CQ vote may be added on another CL
	// which depends on previously CQ-ed CL in this not-yet-started attempt. Then,
	// CQ would extend the attempt with additional CL and reset the waiting
	// counter.
	//
	// Additional implication is that a standalone CL w/o any other relations to
	// other CLs will need to wait this much time before CQ would start processing
	// it (i.e., before it triggers first tryjob).
	StabilizationDelay   *duration.Duration `protobuf:"bytes,1,opt,name=stabilization_delay,json=stabilizationDelay,proto3" json:"stabilization_delay,omitempty"`
	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
	XXX_unrecognized     []byte             `json:"-"`
	XXX_sizecache        int32              `json:"-"`
}

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

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

var xxx_messageInfo_CombineCLs proto.InternalMessageInfo

func (m *CombineCLs) GetStabilizationDelay() *duration.Duration {
	if m != nil {
		return m.StabilizationDelay
	}
	return nil
}

// Verifiers are various types of checks that a Commit Queue performs on a CL.
// All verifiers must pass in order for a CL to be submitted. Configuration file
// describes types of verifiers that should be applied to each CL and their
// parameters.
type Verifiers struct {
	// Required. GerritCQAbility ensures that a user who triggered
	// this CQ attempt actually has rights to do so based on 3 factors:
	//  * membership of the user in committers & dryrunners group,
	//  * the state of CL/patchset on which CQ is triggered,
	//  * relationship of the user to the CL.
	GerritCqAbility *Verifiers_GerritCQAbility `protobuf:"bytes,1,opt,name=gerrit_cq_ability,json=gerritCqAbility,proto3" json:"gerrit_cq_ability,omitempty"`
	// This verifier is used to check tree status before committing a CL. If the
	// tree is closed, then the verifier will wait until it is reopened.
	TreeStatus *Verifiers_TreeStatus `protobuf:"bytes,2,opt,name=tree_status,json=treeStatus,proto3" json:"tree_status,omitempty"`
	// This verifier triggers a set of builds through Buildbucket.
	//
	// CQ automatically retries failed tryjobs and only allows CL to land if each
	// builder has succeeded in the latest retry.
	// If a given tryjob result is too old (>1 day) it is ignored.
	//
	// Typically, builds from Buildbucket are executed on LUCI stack, however, CQ
	// is agnostic to how and where builds are executed.
	Tryjob *Verifiers_Tryjob `protobuf:"bytes,3,opt,name=tryjob,proto3" json:"tryjob,omitempty"`
	// CQLinter is for internal CQ use only. DO NOT USE IN YOUR cq.cfg.
	Cqlinter *Verifiers_CQLinter `protobuf:"bytes,4,opt,name=cqlinter,proto3" json:"cqlinter,omitempty"`
	// Fake is for internal CQ use only. DO NOT USE IN YOUR cq.cfg.
	Fake                 *Verifiers_Fake `protobuf:"bytes,5,opt,name=fake,proto3" json:"fake,omitempty"`
	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
	XXX_unrecognized     []byte          `json:"-"`
	XXX_sizecache        int32           `json:"-"`
}

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

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

var xxx_messageInfo_Verifiers proto.InternalMessageInfo

func (m *Verifiers) GetGerritCqAbility() *Verifiers_GerritCQAbility {
	if m != nil {
		return m.GerritCqAbility
	}
	return nil
}

func (m *Verifiers) GetTreeStatus() *Verifiers_TreeStatus {
	if m != nil {
		return m.TreeStatus
	}
	return nil
}

func (m *Verifiers) GetTryjob() *Verifiers_Tryjob {
	if m != nil {
		return m.Tryjob
	}
	return nil
}

func (m *Verifiers) GetCqlinter() *Verifiers_CQLinter {
	if m != nil {
		return m.Cqlinter
	}
	return nil
}

func (m *Verifiers) GetFake() *Verifiers_Fake {
	if m != nil {
		return m.Fake
	}
	return nil
}

type Verifiers_GerritCQAbility struct {
	// Required. List of chrome-infra-auth groups, whose members are authorized
	// to trigger full CQ runs.
	//
	// Typically, such groups are named "project-<name>-committers".
	CommitterList []string `protobuf:"bytes,1,rep,name=committer_list,json=committerList,proto3" json:"committer_list,omitempty"`
	// Optional, but strongly recommended. List of chrome-infra-auth groups,
	// whose members are authorized to trigger CQ dry run on Gerrit CLs they own
	// (not to be confused with OWNER files) even if CL hasn't been approved.
	//
	// Typically, such groups are named "project-<name>-tryjob-access".
	DryRunAccessList []string `protobuf:"bytes,2,rep,name=dry_run_access_list,json=dryRunAccessList,proto3" json:"dry_run_access_list,omitempty"`
	// Optional. allow_submit_with_open_deps controls how CQ full run behaves
	// when current Gerrit CL has open dependencies (not yet submitted CLs on
	// which *this* CL depends).
	//
	// If set to false (default), CQ will abort full run attempt immediately if
	// open dependencies are detected.
	//
	// If set to true, then CQ will not abort full run and upon passing all
	// other verifiers, CQ will attempt to submit the CL regardless of open
	// dependencies and whether CQ verified those open dependencies.
	// In turn, if Gerrit project config allows this, Gerrit will execute submit
	// of all dependent CLs first and then this CL.
	AllowSubmitWithOpenDeps bool `protobuf:"varint,3,opt,name=allow_submit_with_open_deps,json=allowSubmitWithOpenDeps,proto3" json:"allow_submit_with_open_deps,omitempty"`
	// Optional. Allow CL owner to trigger CQ dry or full run on their own CL,
	// even if not a member of `committer_list` or `dry_run_access_list`.
	// Defaults to no such allowance.
	//
	// WARNING: using this option is not recommended if you have sticky
	// Code-Review label because this allows a malicious developer to upload
	// an good looking patchset at first, get code review approval,
	// and then upload a bad patchset and CQ it right away.
	//
	// CL owner is Gerrit user owning a CL, i.e., its first patchset uploader.
	// not to be confused with OWNERS files.
	AllowOwnerIfSubmittable Verifiers_GerritCQAbility_CQAction `protobuf:"varint,4,opt,name=allow_owner_if_submittable,json=allowOwnerIfSubmittable,proto3,enum=cq.config.Verifiers_GerritCQAbility_CQAction" json:"allow_owner_if_submittable,omitempty"`
	XXX_NoUnkeyedLiteral    struct{}                           `json:"-"`
	XXX_unrecognized        []byte                             `json:"-"`
	XXX_sizecache           int32                              `json:"-"`
}

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

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

var xxx_messageInfo_Verifiers_GerritCQAbility proto.InternalMessageInfo

func (m *Verifiers_GerritCQAbility) GetCommitterList() []string {
	if m != nil {
		return m.CommitterList
	}
	return nil
}

func (m *Verifiers_GerritCQAbility) GetDryRunAccessList() []string {
	if m != nil {
		return m.DryRunAccessList
	}
	return nil
}

func (m *Verifiers_GerritCQAbility) GetAllowSubmitWithOpenDeps() bool {
	if m != nil {
		return m.AllowSubmitWithOpenDeps
	}
	return false
}

func (m *Verifiers_GerritCQAbility) GetAllowOwnerIfSubmittable() Verifiers_GerritCQAbility_CQAction {
	if m != nil {
		return m.AllowOwnerIfSubmittable
	}
	return Verifiers_GerritCQAbility_UNSET
}

type Verifiers_TreeStatus struct {
	// Required. URL of the project tree status app.
	Url                  string   `protobuf:"bytes,1,opt,name=url,proto3" json:"url,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Verifiers_TreeStatus proto.InternalMessageInfo

func (m *Verifiers_TreeStatus) GetUrl() string {
	if m != nil {
		return m.Url
	}
	return ""
}

type Verifiers_Tryjob struct {
	// Builders on which tryjobs should be triggered.
	Builders []*Verifiers_Tryjob_Builder `protobuf:"bytes,1,rep,name=builders,proto3" json:"builders,omitempty"`
	// Optional, defaulting to no retries whatsoever.
	RetryConfig *Verifiers_Tryjob_RetryConfig `protobuf:"bytes,2,opt,name=retry_config,json=retryConfig,proto3" json:"retry_config,omitempty"`
	// EXPERIMENTAL. WORK IN PROGRESS. https://crbug.com/909895.
	// Optional. If YES, running or not-yet-started tryjobs will be cancelled as
	// soon as substantially different patchset is uploaded to a CL.
	CancelStaleTryjobs   Toggle   `protobuf:"varint,3,opt,name=cancel_stale_tryjobs,json=cancelStaleTryjobs,proto3,enum=cq.config.Toggle" json:"cancel_stale_tryjobs,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Verifiers_Tryjob proto.InternalMessageInfo

func (m *Verifiers_Tryjob) GetBuilders() []*Verifiers_Tryjob_Builder {
	if m != nil {
		return m.Builders
	}
	return nil
}

func (m *Verifiers_Tryjob) GetRetryConfig() *Verifiers_Tryjob_RetryConfig {
	if m != nil {
		return m.RetryConfig
	}
	return nil
}

func (m *Verifiers_Tryjob) GetCancelStaleTryjobs() Toggle {
	if m != nil {
		return m.CancelStaleTryjobs
	}
	return Toggle_UNSET
}

type Verifiers_Tryjob_Builder struct {
	// Required. Name of the builder as <project>/<bucket>/<builder>
	//
	// Examples:
	//   "chromium/try/linux-tester"
	//   "other-project/try/shared-try-builder"
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Optional. If true, a fresh build will be required for each CQ attempt.
	//
	// Default is false, meaning CQ may re-use a successful build
	// triggered before current CQ attempt started.
	//
	// This option is typically used for builders which run depot_tools'
	// PRESUBMIT scripts, which are supposed to be quick to run and provide
	// additional OWNERS, lint, etc checks which are useful to run against
	// the latest revision of the CL's target branch.
	DisableReuse bool `protobuf:"varint,2,opt,name=disable_reuse,json=disableReuse,proto3" json:"disable_reuse,omitempty"`
	// Optional name of a builder (aka parent) which will trigger this builder
	// (aka child).
	//
	// If `triggered_by` is not specified (default), CQ will trigger this
	// builder directly.
	//
	// Else, CQ will wait for `triggered_by` (parent) builder to trigger
	// (possibly, indirectly) this (child) builder.
	// Conditions:
	//   * `triggered_by` (parent) builder must set a special property
	//     `triggered_build_ids` upon successful completion with value set
	//     to a list of triggered Buildbucket build IDs,
	//     corresponding to each triggered build. One or more of the IDs must
	//     correspond to this (child) builder, which will then be waited for
	//     by CQ.
	//   * parent->child relationship graph must be a forest (set of a trees).
	//     However, grandparent->parent->child triggering structure isn't well
	//     tested. Please, talk to CQ maintainers to discuss your use case if you
	//     actually need it.
	//
	// Failure/Retry semantics:
	//   * If `triggered_by` (parent) builder succeeds, but doesn't set
	//     the right `triggered_build_ids` s.t. CQ can't find this (child)
	//     builder among triggered builds, then CQ will wait till
	//     TRYJOB_PENDING_TIMEOUT is reached, currently hardcoded at 2 hours.
	//     TODO(tandrii,sergiyb): improve this.
	//   * If this (child) builder fails and CQ still has retry budget,
	//     CQ will retry a parent builder.
	//
	// For example, given config:
	//   builder { name:         "*/m/mac_compiler" }
	//   builder { name:         "*/m/mac_tester_10.12"
	//             triggered_by: "*/m/mac_compiler" }
	//   builder { name:         "*/m/mac_tester_10.13"
	//             triggered_by: "*/m/mac_compiler" }
	// CQ will trigger and wait for "mac_compiler" to succeed. Then, it'll
	// check its `triggered_build_ids` and find which ones correspond to
	// "mac_tester_10.12" and "mac_tester_10.13" and wait for each to
	// complete.  If say "mac_tester_10.12" fails, CQ will retry
	// "mac_compiler" and expect it to trigger new builds for
	// "mac_tester_10.12" and "mac_tester_10.13".
	TriggeredBy string `protobuf:"bytes,3,opt,name=triggered_by,json=triggeredBy,proto3" json:"triggered_by,omitempty"`
	// Optional. When this field is present, it marks given builder as
	// experimental. It is only triggered on a given percentage of the CLs and
	// the outcome does not affect the decicion whether a CL can land or not.
	// This is typically used to test new builders and estimate their capacity
	// requirements.
	ExperimentPercentage float32 `protobuf:"fixed32,4,opt,name=experiment_percentage,json=experimentPercentage,proto3" json:"experiment_percentage,omitempty"`
	// Optionally specified alternative builder for CQ to choose instead.
	// If provided, CQ will choose only one of the equivalent builders as
	// required based purely on given CL and CL's owner and **regardless** of
	// the possibly already completed try jobs.
	//
	// Note: none of the equivalent builders should be part of triggered_by
	// chain, although CQ may eventually relax this requirement.
	EquivalentTo *Verifiers_Tryjob_EquivalentBuilder `protobuf:"bytes,5,opt,name=equivalent_to,json=equivalentTo,proto3" json:"equivalent_to,omitempty"`
	// Optional. Require this builder only if location_regexp matches a file in
	// this CL.
	//
	// This means:
	//   * If specified and no file in a CL matches any of the location_regexp,
	//   then CQ will not care about this builder.
	//   * If a file in a CL matches any location_regexp_exclude, then this file
	//   won't be considered when matching location_regexp.
	//
	// If location_regexp is not specified (default), builder will be used
	// on all CLs.
	//
	// The location_regexp is matches are done against the following string:
	//   <gerrit_url>/<gerrit_project_name>/+/<cl_file_path>
	// File path must be relative to root of the repo, and it uses Unix /
	// directory separators.
	//
	// The comparison is a full match; the pattern is implicitly anchored with
	// "^" and "$", so there is no need add them.
	//
	// Touching a file means either adding, modifying or removing it.
	//
	// These options currently can not be combined with the following other options:
	//   * experiment_percentage
	//   * triggered_by
	//   * GerritCQAbility.allow_submit_with_open_deps
	// If you need to combine them, please talk to CQ owners.
	//
	// Examples:
	//
	//   location_regexp:
	//   "https://chromium-review.googlesource.com/chromium/src/[+]/third_party/WebKit/.+"
	//     will enable builder for all CLs touching any file in
	//     third_party/WebKit directory of the chromium/src repo, but not
	//     directory itself.
	//
	//   location_regexp:         "https://example.com/repo/[+]/.+"
	//   location_regexp_exclude: "https://example.com/repo/[+]/all/one.txt"
	//     will match a CL which touches at least one file other than
	//     'one.txt' inside all/ directory of the Gerrit project "repo".
	//
	//   location_regexp_exclude: "https://example.com/.+/[+]/one.txt"
	//     will match a CL which touches at least one file other than
	//     'one.txt' in any repository OR belongs to any other Gerrit server.
	//     Note, in this case location_regexp defaults to ".*".
	LocationRegexp        []string `protobuf:"bytes,6,rep,name=location_regexp,json=locationRegexp,proto3" json:"location_regexp,omitempty"`
	LocationRegexpExclude []string `protobuf:"bytes,7,rep,name=location_regexp_exclude,json=locationRegexpExclude,proto3" json:"location_regexp_exclude,omitempty"`
	// If set, this builder will only be triggered if the CL owner (who first
	// uploaded the CL) is a member of at least one of these groups.
	OwnerWhitelistGroup  []string `protobuf:"bytes,8,rep,name=owner_whitelist_group,json=ownerWhitelistGroup,proto3" json:"owner_whitelist_group,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Verifiers_Tryjob_Builder proto.InternalMessageInfo

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

func (m *Verifiers_Tryjob_Builder) GetDisableReuse() bool {
	if m != nil {
		return m.DisableReuse
	}
	return false
}

func (m *Verifiers_Tryjob_Builder) GetTriggeredBy() string {
	if m != nil {
		return m.TriggeredBy
	}
	return ""
}

func (m *Verifiers_Tryjob_Builder) GetExperimentPercentage() float32 {
	if m != nil {
		return m.ExperimentPercentage
	}
	return 0
}

func (m *Verifiers_Tryjob_Builder) GetEquivalentTo() *Verifiers_Tryjob_EquivalentBuilder {
	if m != nil {
		return m.EquivalentTo
	}
	return nil
}

func (m *Verifiers_Tryjob_Builder) GetLocationRegexp() []string {
	if m != nil {
		return m.LocationRegexp
	}
	return nil
}

func (m *Verifiers_Tryjob_Builder) GetLocationRegexpExclude() []string {
	if m != nil {
		return m.LocationRegexpExclude
	}
	return nil
}

func (m *Verifiers_Tryjob_Builder) GetOwnerWhitelistGroup() []string {
	if m != nil {
		return m.OwnerWhitelistGroup
	}
	return nil
}

type Verifiers_Tryjob_EquivalentBuilder struct {
	// Required. Name of this builder.
	// Format is the same in the same format as Builder.name.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Percentage expressing probability of CQ triggering this builder instead
	// of the builder to which this builder is equilvanet to.
	//
	// A choice itself is made deterministicly based on CL alone, hereby
	// all CQ attempts on all patchsets of a given CL will trigger the same
	// builder, assuming CQ config doesn't change in the mean time.
	//
	// Note that if `owner_whitelist_group` is also specified, the choice over
	// which of the two builders to trigger will be made only for CLs owned by
	// whitelisted group.
	//
	// If not specified, defaults to 0, meaning this builder is never
	// triggered by CQ, but an existing build can be re-used by CQ.
	//
	// To illustrate, suppose percentage=10. Then,
	//   Without owner_whitelist_group,
	//      ~10% of all CQ attempts will trigger this builder.
	//   With owner_whitelist_group set and, suppose, 1/5 of CQ attempts are
	//      ran on CLs owned by this group, then only ~(1/10)*(1/5) or
	//      ~2% of all CQ attempts will trigger this builder.
	Percentage float32 `protobuf:"fixed32,2,opt,name=percentage,proto3" json:"percentage,omitempty"`
	// If specified, limits the builder to CL owners in this group.
	OwnerWhitelistGroup  string   `protobuf:"bytes,3,opt,name=owner_whitelist_group,json=ownerWhitelistGroup,proto3" json:"owner_whitelist_group,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *Verifiers_Tryjob_EquivalentBuilder) Reset()         { *m = Verifiers_Tryjob_EquivalentBuilder{} }
func (m *Verifiers_Tryjob_EquivalentBuilder) String() string { return proto.CompactTextString(m) }
func (*Verifiers_Tryjob_EquivalentBuilder) ProtoMessage()    {}
func (*Verifiers_Tryjob_EquivalentBuilder) Descriptor() ([]byte, []int) {
	return fileDescriptor_59a2f489dbd601ec, []int{4, 2, 1}
}

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

var xxx_messageInfo_Verifiers_Tryjob_EquivalentBuilder proto.InternalMessageInfo

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

func (m *Verifiers_Tryjob_EquivalentBuilder) GetPercentage() float32 {
	if m != nil {
		return m.Percentage
	}
	return 0
}

func (m *Verifiers_Tryjob_EquivalentBuilder) GetOwnerWhitelistGroup() string {
	if m != nil {
		return m.OwnerWhitelistGroup
	}
	return ""
}

// Collection of parameters for deciding whether to retry a single build.
// If parameter is not specified, its value defaults to 0 (per proto3).
// Thus, omitting all parameters means no retries of any kind.
type Verifiers_Tryjob_RetryConfig struct {
	// Retry quota for a single tryjob.
	SingleQuota int32 `protobuf:"varint,1,opt,name=single_quota,json=singleQuota,proto3" json:"single_quota,omitempty"`
	// Retry quota for all tryjobs in a CL.
	GlobalQuota int32 `protobuf:"varint,2,opt,name=global_quota,json=globalQuota,proto3" json:"global_quota,omitempty"`
	// The weight assigned to each tryjob failure.
	FailureWeight int32 `protobuf:"varint,3,opt,name=failure_weight,json=failureWeight,proto3" json:"failure_weight,omitempty"`
	// The weight assigned to each transient failure.
	TransientFailureWeight int32 `protobuf:"varint,4,opt,name=transient_failure_weight,json=transientFailureWeight,proto3" json:"transient_failure_weight,omitempty"`
	// The weight assigned to tryjob timeouts.
	TimeoutWeight        int32    `protobuf:"varint,5,opt,name=timeout_weight,json=timeoutWeight,proto3" json:"timeout_weight,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Verifiers_Tryjob_RetryConfig proto.InternalMessageInfo

func (m *Verifiers_Tryjob_RetryConfig) GetSingleQuota() int32 {
	if m != nil {
		return m.SingleQuota
	}
	return 0
}

func (m *Verifiers_Tryjob_RetryConfig) GetGlobalQuota() int32 {
	if m != nil {
		return m.GlobalQuota
	}
	return 0
}

func (m *Verifiers_Tryjob_RetryConfig) GetFailureWeight() int32 {
	if m != nil {
		return m.FailureWeight
	}
	return 0
}

func (m *Verifiers_Tryjob_RetryConfig) GetTransientFailureWeight() int32 {
	if m != nil {
		return m.TransientFailureWeight
	}
	return 0
}

func (m *Verifiers_Tryjob_RetryConfig) GetTimeoutWeight() int32 {
	if m != nil {
		return m.TimeoutWeight
	}
	return 0
}

// CQLinter is for internal use in CQ.
type Verifiers_CQLinter struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Verifiers_CQLinter proto.InternalMessageInfo

// Fake is for internal use in CQ.
type Verifiers_Fake struct {
	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	EventualState        string   `protobuf:"bytes,2,opt,name=eventual_state,json=eventualState,proto3" json:"eventual_state,omitempty"`
	Delay                int32    `protobuf:"varint,3,opt,name=delay,proto3" json:"delay,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Verifiers_Fake proto.InternalMessageInfo

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

func (m *Verifiers_Fake) GetEventualState() string {
	if m != nil {
		return m.EventualState
	}
	return ""
}

func (m *Verifiers_Fake) GetDelay() int32 {
	if m != nil {
		return m.Delay
	}
	return 0
}

func init() {
	proto.RegisterEnum("cq.config.Toggle", Toggle_name, Toggle_value)
	proto.RegisterEnum("cq.config.Verifiers_GerritCQAbility_CQAction", Verifiers_GerritCQAbility_CQAction_name, Verifiers_GerritCQAbility_CQAction_value)
	proto.RegisterType((*Config)(nil), "cq.config.Config")
	proto.RegisterType((*SubmitOptions)(nil), "cq.config.SubmitOptions")
	proto.RegisterType((*ConfigGroup)(nil), "cq.config.ConfigGroup")
	proto.RegisterType((*ConfigGroup_Gerrit)(nil), "cq.config.ConfigGroup.Gerrit")
	proto.RegisterType((*ConfigGroup_Gerrit_Project)(nil), "cq.config.ConfigGroup.Gerrit.Project")
	proto.RegisterType((*ConfigGroup_Gerrit_Project_CrOSMigration)(nil), "cq.config.ConfigGroup.Gerrit.Project.CrOSMigration")
	proto.RegisterType((*CombineCLs)(nil), "cq.config.CombineCLs")
	proto.RegisterType((*Verifiers)(nil), "cq.config.Verifiers")
	proto.RegisterType((*Verifiers_GerritCQAbility)(nil), "cq.config.Verifiers.GerritCQAbility")
	proto.RegisterType((*Verifiers_TreeStatus)(nil), "cq.config.Verifiers.TreeStatus")
	proto.RegisterType((*Verifiers_Tryjob)(nil), "cq.config.Verifiers.Tryjob")
	proto.RegisterType((*Verifiers_Tryjob_Builder)(nil), "cq.config.Verifiers.Tryjob.Builder")
	proto.RegisterType((*Verifiers_Tryjob_EquivalentBuilder)(nil), "cq.config.Verifiers.Tryjob.EquivalentBuilder")
	proto.RegisterType((*Verifiers_Tryjob_RetryConfig)(nil), "cq.config.Verifiers.Tryjob.RetryConfig")
	proto.RegisterType((*Verifiers_CQLinter)(nil), "cq.config.Verifiers.CQLinter")
	proto.RegisterType((*Verifiers_Fake)(nil), "cq.config.Verifiers.Fake")
}

func init() {
	proto.RegisterFile("go.chromium.org/luci/cq/api/config/v2/cq.proto", fileDescriptor_59a2f489dbd601ec)
}

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