// 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 Trinary int32

const (
	Trinary_UNSET Trinary = 0
	Trinary_YES   Trinary = 1
	Trinary_NO    Trinary = 2
)

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

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

func (x Trinary) String() string {
	return proto.EnumName(Trinary_name, int32(x))
}

func (Trinary) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_59a2f489dbd601ec, []int{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"`
	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
}

// 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"`
	// EXPERIMENTAL!
	CqdependOptions *CQDependOptions `protobuf:"bytes,3,opt,name=cqdepend_options,json=cqdependOptions,proto3" json:"cqdepend_options,omitempty"`
	// Defines how to verify a CL before submitting it. Required.
	Verifiers            *Verifiers `protobuf:"bytes,2,opt,name=verifiers,proto3" json:"verifiers,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) GetCqdependOptions() *CQDependOptions {
	if m != nil {
		return m.CqdependOptions
	}
	return nil
}

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

// 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"`
	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
}

// EXPERIMENTAL! TODO(tandrii, crbug/912294): add doc.
type CQDependOptions struct {
	Allowed              Trinary  `protobuf:"varint,1,opt,name=allowed,proto3,enum=cq.config.Trinary" json:"allowed,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_CQDependOptions proto.InternalMessageInfo

func (m *CQDependOptions) GetAllowed() Trinary {
	if m != nil {
		return m.Allowed
	}
	return Trinary_UNSET
}

// 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"`
	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
}

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"`
	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
}

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"
	//
	// For legacy buckets on buildbot, use * as project placeholder, e.g.,
	//   "*/master.tryserver.example/linux-tester"
	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 when the CL owner is listed
	// here.
	OwnersWhitelistGroup []string `protobuf:"bytes,8,rep,name=owners_whitelist_group,json=ownersWhitelistGroup,proto3" json:"owners_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) GetOwnersWhitelistGroup() []string {
	if m != nil {
		return m.OwnersWhitelistGroup
	}
	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.Trinary", Trinary_name, Trinary_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((*CQDependOptions)(nil), "cq.config.CQDependOptions")
	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{
	// 1140 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x56, 0x5d, 0x6f, 0xdb, 0x36,
	0x17, 0x7e, 0xed, 0x24, 0x8e, 0x7d, 0x14, 0x3b, 0x2e, 0x9b, 0xb6, 0x7e, 0x5d, 0xb4, 0xeb, 0xd2,
	0x1a, 0x2d, 0x86, 0x55, 0x06, 0xdc, 0x6d, 0xd8, 0x47, 0x81, 0xae, 0xf9, 0x68, 0x87, 0xa1, 0x68,
	0x1b, 0x26, 0x5b, 0xb0, 0xdd, 0x10, 0xb2, 0x74, 0x2c, 0xb3, 0x95, 0x45, 0x99, 0xa2, 0x92, 0x18,
	0xbb, 0xde, 0xaf, 0xd8, 0xf5, 0x7e, 0xd5, 0xb6, 0xdb, 0xfd, 0x86, 0x5d, 0x0e, 0x24, 0x25, 0xd9,
	0x75, 0xbc, 0xdc, 0x89, 0xcf, 0x79, 0x1e, 0x1e, 0x9e, 0x2f, 0x52, 0xe0, 0x86, 0xc2, 0xf5, 0xc7,
	0x52, 0x4c, 0x78, 0x36, 0x71, 0x85, 0x0c, 0xfb, 0x51, 0xe6, 0xf3, 0xbe, 0x3f, 0xed, 0x7b, 0x09,
	0xef, 0xfb, 0x22, 0x1e, 0xf1, 0xb0, 0x7f, 0x36, 0xe8, 0xfb, 0x53, 0x37, 0x91, 0x42, 0x09, 0xd2,
	0xf0, 0xa7, 0xae, 0x85, 0xbb, 0x77, 0x43, 0x21, 0xc2, 0x08, 0xfb, 0xc6, 0x30, 0xcc, 0x46, 0xfd,
	0x20, 0x93, 0x9e, 0xe2, 0x22, 0xb6, 0xd4, 0xdd, 0x3f, 0x2b, 0x50, 0xdb, 0x37, 0x54, 0xe2, 0xc2,
	0xf5, 0x40, 0x7a, 0x3c, 0xe6, 0x71, 0xc8, 0x52, 0xe5, 0x49, 0xc5, 0x14, 0x9f, 0x60, 0xa7, 0x72,
	0xaf, 0xf2, 0xa8, 0x41, 0xaf, 0x15, 0xa6, 0x63, 0x6d, 0x39, 0xe1, 0x13, 0x24, 0x0f, 0xa0, 0xe5,
	0x4f, 0x35, 0x53, 0x65, 0x29, 0x1b, 0x8b, 0x54, 0x75, 0xaa, 0x86, 0xba, 0xe5, 0x4f, 0x8f, 0x0d,
	0xf8, 0x9d, 0x48, 0x15, 0x79, 0x06, 0xad, 0x34, 0x1b, 0x4e, 0xb8, 0x62, 0x22, 0xd1, 0x7e, 0xd3,
	0xce, 0xda, 0xbd, 0xca, 0x23, 0x67, 0xd0, 0x71, 0xcb, 0x43, 0xba, 0xc7, 0x86, 0xf0, 0xc6, 0xda,
	0x69, 0x33, 0x5d, 0x5c, 0x92, 0x6f, 0xa0, 0x69, 0x69, 0x2c, 0x94, 0x22, 0x4b, 0xd2, 0xce, 0xfa,
	0xbd, 0xb5, 0x47, 0xce, 0xe0, 0xe6, 0x82, 0xde, 0x06, 0xf0, 0x52, 0x9b, 0xe9, 0x96, 0x3f, 0x5f,
	0xa4, 0xbb, 0x63, 0x68, 0x7e, 0xb0, 0x39, 0xb9, 0x0d, 0x8d, 0x89, 0x77, 0xc1, 0x86, 0x99, 0x4c,
	0x95, 0x09, 0x6d, 0x83, 0xd6, 0x27, 0xde, 0xc5, 0x9e, 0x5e, 0x93, 0xaf, 0xc1, 0x31, 0x06, 0x16,
	0x60, 0xe4, 0xcd, 0x4c, 0x38, 0xce, 0xe0, 0xff, 0xae, 0x4d, 0xa1, 0x5b, 0xa4, 0xd0, 0x3d, 0xc8,
	0x53, 0x48, 0xc1, 0xb0, 0x0f, 0x34, 0x79, 0xf7, 0xaf, 0x2a, 0x38, 0x0b, 0xe7, 0x20, 0x9f, 0x43,
	0x2d, 0x44, 0x29, 0xb9, 0xf6, 0xa2, 0xcf, 0x7b, 0x67, 0xf5, 0x79, 0xdd, 0x97, 0x86, 0x44, 0x73,
	0x32, 0x39, 0x84, 0xb6, 0x3f, 0x0d, 0x30, 0xc1, 0x38, 0x58, 0x4a, 0x58, 0x77, 0x71, 0x83, 0xa3,
	0x03, 0x43, 0x29, 0x52, 0xb6, 0x5d, 0x68, 0x8a, 0x30, 0x07, 0xd0, 0x38, 0x43, 0xc9, 0x47, 0x1c,
	0x65, 0x9a, 0xc7, 0xb1, 0xb3, 0xa0, 0xff, 0xb1, 0xb0, 0xd1, 0x39, 0xad, 0xfb, 0x5b, 0x05, 0x6a,
	0xf6, 0x34, 0xa4, 0x0d, 0x6b, 0x99, 0x8c, 0xf2, 0xd2, 0xeb, 0x4f, 0xf2, 0x1c, 0xea, 0x89, 0x14,
	0xef, 0xd0, 0x57, 0x7a, 0x3f, 0x1d, 0x50, 0xef, 0xca, 0x80, 0xdc, 0xb7, 0x96, 0x4d, 0x4b, 0x59,
	0xf7, 0x29, 0x6c, 0xe6, 0x20, 0x21, 0xb0, 0x1e, 0x7b, 0x65, 0x6f, 0x99, 0x6f, 0x72, 0x07, 0x40,
	0xe2, 0x88, 0x49, 0x0c, 0xf1, 0x22, 0x31, 0x3e, 0x1a, 0xb4, 0x21, 0x71, 0x44, 0x0d, 0xb0, 0xfb,
	0x0c, 0xb6, 0x97, 0xa2, 0x26, 0x9f, 0xc2, 0xa6, 0x17, 0x45, 0xe2, 0x1c, 0x03, 0xb3, 0x51, 0x6b,
	0x40, 0x16, 0x8e, 0x74, 0x22, 0x79, 0xec, 0xc9, 0x19, 0x2d, 0x28, 0xbb, 0x7f, 0x3b, 0xd0, 0x28,
	0xe3, 0x26, 0x6f, 0xe1, 0x9a, 0xcd, 0x38, 0xf3, 0xa7, 0xcc, 0x1b, 0xf2, 0x88, 0xab, 0x99, 0xd9,
	0xc5, 0x19, 0x3c, 0x58, 0x95, 0xa8, 0x3c, 0xac, 0xfd, 0xa3, 0xe7, 0x96, 0x4b, 0xb7, 0xad, 0x7c,
	0x7f, 0x9a, 0x03, 0xe4, 0x5b, 0x70, 0x94, 0x44, 0xcc, 0x07, 0x22, 0x4f, 0xfa, 0x47, 0x2b, 0xf7,
	0x3a, 0x91, 0x88, 0x76, 0x44, 0x28, 0xa8, 0xf2, 0x9b, 0x3c, 0x81, 0x9a, 0x92, 0xb3, 0x77, 0x62,
	0x98, 0x57, 0xfc, 0xf6, 0x7f, 0x88, 0x35, 0x85, 0xe6, 0x54, 0xf2, 0x15, 0xd4, 0xfd, 0x69, 0xc4,
	0x63, 0x85, 0xb2, 0xb3, 0x6e, 0x64, 0x77, 0x56, 0xca, 0xf6, 0x8f, 0x5e, 0x19, 0x12, 0x2d, 0xe9,
	0xe4, 0x31, 0xac, 0x8f, 0xbc, 0xf7, 0xd8, 0xd9, 0xc8, 0xfb, 0x7c, 0x95, 0xec, 0x85, 0xf7, 0x1e,
	0xa9, 0xa1, 0x75, 0x7f, 0xaf, 0xc0, 0xf6, 0x52, 0x16, 0x48, 0x0f, 0x5a, 0xbe, 0x98, 0x4c, 0xb8,
	0x52, 0x28, 0x59, 0xc4, 0x53, 0xdb, 0xed, 0x0d, 0xda, 0x2c, 0xd1, 0x57, 0x3c, 0x55, 0xe4, 0xb1,
	0xbe, 0x5a, 0x66, 0x4c, 0x66, 0x31, 0xf3, 0x7c, 0x1f, 0xd3, 0xd4, 0x72, 0x6d, 0x91, 0xdb, 0x81,
	0x9c, 0xd1, 0x2c, 0x7e, 0x6e, 0x0c, 0x86, 0xfe, 0x14, 0x6e, 0x9b, 0xaa, 0xb1, 0xfc, 0xe6, 0x38,
	0xe7, 0x6a, 0xcc, 0x44, 0x82, 0x31, 0x0b, 0x30, 0xb1, 0xf3, 0x50, 0xa7, 0xb7, 0x0c, 0xc5, 0x4e,
	0xf7, 0x29, 0x57, 0xe3, 0x37, 0x09, 0xc6, 0x07, 0x98, 0xa4, 0xdd, 0xbb, 0x00, 0xf3, 0x04, 0x5f,
	0x6e, 0xe5, 0xee, 0x3f, 0x35, 0xa8, 0xd9, 0x24, 0x92, 0x67, 0x50, 0x1f, 0x66, 0x3c, 0x0a, 0xf4,
	0x94, 0xd8, 0x31, 0xbd, 0x7f, 0x45, 0xce, 0xdd, 0x3d, 0xcb, 0xa5, 0xa5, 0x88, 0x7c, 0x0f, 0x5b,
	0x12, 0x95, 0x9c, 0x31, 0x2b, 0xc9, 0xab, 0xfe, 0xf0, 0xaa, 0x4d, 0xa8, 0xe6, 0xdb, 0x81, 0xa1,
	0x8e, 0x9c, 0x2f, 0xba, 0xbf, 0xae, 0xc1, 0x66, 0xee, 0x61, 0xe5, 0x80, 0xdc, 0x87, 0x66, 0xc0,
	0x53, 0x6f, 0x18, 0x21, 0x93, 0x98, 0xa5, 0x68, 0x9c, 0xd5, 0xe9, 0x56, 0x0e, 0x52, 0x8d, 0x91,
	0x8f, 0x61, 0x4b, 0x49, 0x1e, 0x86, 0x28, 0x31, 0x60, 0xc3, 0x99, 0xc9, 0x55, 0x83, 0x3a, 0x25,
	0xb6, 0x37, 0x23, 0x4f, 0xe0, 0x06, 0x5e, 0x24, 0x28, 0xf9, 0x04, 0x63, 0xc5, 0x12, 0x94, 0x3e,
	0xc6, 0xca, 0x0b, 0xd1, 0xb4, 0x4f, 0x95, 0xee, 0xcc, 0x8d, 0x6f, 0x4b, 0x1b, 0xa1, 0xd0, 0xc4,
	0x69, 0xc6, 0xcf, 0xbc, 0x48, 0x8b, 0x94, 0xc8, 0x9b, 0xe6, 0xf1, 0x55, 0x91, 0x1e, 0x96, 0x82,
	0x22, 0x71, 0x5b, 0xf3, 0x3d, 0x4e, 0x04, 0x79, 0x08, 0xdb, 0x91, 0xf0, 0xcd, 0x55, 0x5a, 0x8c,
	0x7d, 0xcd, 0x74, 0x44, 0xab, 0x80, 0xed, 0xec, 0x93, 0x2f, 0xe0, 0xd6, 0x12, 0x91, 0xe1, 0x85,
	0x1f, 0x65, 0x01, 0x76, 0x36, 0x8d, 0xe0, 0xc6, 0x87, 0x82, 0x43, 0x6b, 0x24, 0x9f, 0xc1, 0x4d,
	0x71, 0x1e, 0xa3, 0x4c, 0xd9, 0xf9, 0x98, 0x2b, 0xd4, 0x3d, 0x67, 0x1f, 0x91, 0x4e, 0xdd, 0xc8,
	0x76, 0xac, 0xf5, 0xb4, 0x30, 0x9a, 0x0b, 0xac, 0xfb, 0x0b, 0x5c, 0xbb, 0x74, 0xf2, 0x95, 0x05,
	0xb9, 0x0b, 0xb0, 0x90, 0xbd, 0xaa, 0xc9, 0xde, 0x02, 0x42, 0x06, 0x70, 0xc3, 0x38, 0xb8, 0xe4,
	0xdd, 0x16, 0xe5, 0xba, 0x31, 0x2e, 0x39, 0xff, 0xa3, 0x02, 0xce, 0x42, 0x87, 0xe8, 0x7a, 0xa6,
	0x3c, 0x0e, 0x23, 0x64, 0xd3, 0x4c, 0x28, 0x2f, 0x7f, 0xb2, 0x1c, 0x8b, 0x1d, 0x69, 0x48, 0x53,
	0xc2, 0x48, 0x0c, 0xbd, 0x28, 0xa7, 0x54, 0x2d, 0xc5, 0x62, 0x96, 0xd2, 0x83, 0xd6, 0xc8, 0xe3,
	0x51, 0x26, 0x91, 0x9d, 0x23, 0x0f, 0xc7, 0xca, 0x1c, 0x61, 0x83, 0x36, 0x73, 0xf4, 0xd4, 0x80,
	0xe4, 0x4b, 0xe8, 0x28, 0xe9, 0xc5, 0x29, 0xd7, 0x35, 0x5e, 0x12, 0xac, 0x1b, 0xc1, 0xcd, 0xd2,
	0xfe, 0xe2, 0x03, 0x65, 0x0f, 0x5a, 0xfa, 0x67, 0x41, 0x64, 0xaa, 0xe0, 0x6f, 0x58, 0x07, 0x39,
	0x6a, 0x69, 0x5d, 0x80, 0x7a, 0x71, 0x0f, 0x75, 0x4f, 0x61, 0x5d, 0x5f, 0x2e, 0x2b, 0x33, 0xdb,
	0x83, 0x16, 0x9e, 0x61, 0xac, 0x32, 0x2f, 0x32, 0xf7, 0x29, 0xe6, 0xbf, 0x16, 0xcd, 0x02, 0xd5,
	0xc3, 0x8d, 0x64, 0x07, 0x36, 0xec, 0x4b, 0x6d, 0xa3, 0xb1, 0x8b, 0x4f, 0x7a, 0xb0, 0x99, 0x5f,
	0xfe, 0xa4, 0x01, 0x1b, 0x3f, 0xbc, 0x3e, 0x3e, 0x3c, 0x69, 0xff, 0x8f, 0x6c, 0xc2, 0xda, 0x4f,
	0x87, 0xc7, 0xed, 0x0a, 0xa9, 0x41, 0xf5, 0xf5, 0x9b, 0x76, 0x75, 0xaf, 0xfe, 0x73, 0xcd, 0x36,
	0xee, 0xb0, 0x66, 0x5e, 0xf6, 0x27, 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0xac, 0x0f, 0xe5, 0x1c,
	0x67, 0x09, 0x00, 0x00,
}
