// Copyright 2019 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.25.0-devel
// 	protoc        v3.6.1
// source: test_platform/steps/execution.proto

package steps

import (
	test_platform "go.chromium.org/chromiumos/infra/proto/go/test_platform"
	common "go.chromium.org/chromiumos/infra/proto/go/test_platform/common"
	config "go.chromium.org/chromiumos/infra/proto/go/test_platform/config"
	execute "go.chromium.org/chromiumos/infra/proto/go/test_platform/steps/execute"
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
	reflect "reflect"
	sync "sync"
)

const (
	// Verify that this generated code is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
	// Verify that runtime/protoimpl is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)

type ExecuteRequests struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

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

func (x *ExecuteRequests) Reset() {
	*x = ExecuteRequests{}
	if protoimpl.UnsafeEnabled {
		mi := &file_test_platform_steps_execution_proto_msgTypes[0]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *ExecuteRequests) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ExecuteRequests) ProtoMessage() {}

func (x *ExecuteRequests) ProtoReflect() protoreflect.Message {
	mi := &file_test_platform_steps_execution_proto_msgTypes[0]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ExecuteRequests.ProtoReflect.Descriptor instead.
func (*ExecuteRequests) Descriptor() ([]byte, []int) {
	return file_test_platform_steps_execution_proto_rawDescGZIP(), []int{0}
}

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

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

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

type ExecuteResponses struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

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

func (x *ExecuteResponses) Reset() {
	*x = ExecuteResponses{}
	if protoimpl.UnsafeEnabled {
		mi := &file_test_platform_steps_execution_proto_msgTypes[1]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *ExecuteResponses) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ExecuteResponses) ProtoMessage() {}

func (x *ExecuteResponses) ProtoReflect() protoreflect.Message {
	mi := &file_test_platform_steps_execution_proto_msgTypes[1]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ExecuteResponses.ProtoReflect.Descriptor instead.
func (*ExecuteResponses) Descriptor() ([]byte, []int) {
	return file_test_platform_steps_execution_proto_rawDescGZIP(), []int{1}
}

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

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

// ExecuteRequest defines the input of the Execute step.
type ExecuteRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// RequestParams are the request-wide parameters for the
	// cros_test_platform request. This includes all the request-wide information
	// needed in order to execute tests (e.g. labels, retry parameters,
	// scheduling parameters).
	RequestParams *test_platform.Request_Params `protobuf:"bytes,1,opt,name=request_params,json=requestParams,proto3" json:"request_params,omitempty"`
	Enumeration   *EnumerationResponse          `protobuf:"bytes,2,opt,name=enumeration,proto3" json:"enumeration,omitempty"`
	Config        *config.Config                `protobuf:"bytes,3,opt,name=config,proto3" json:"config,omitempty"`
}

func (x *ExecuteRequest) Reset() {
	*x = ExecuteRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_test_platform_steps_execution_proto_msgTypes[2]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *ExecuteRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ExecuteRequest) ProtoMessage() {}

func (x *ExecuteRequest) ProtoReflect() protoreflect.Message {
	mi := &file_test_platform_steps_execution_proto_msgTypes[2]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ExecuteRequest.ProtoReflect.Descriptor instead.
func (*ExecuteRequest) Descriptor() ([]byte, []int) {
	return file_test_platform_steps_execution_proto_rawDescGZIP(), []int{2}
}

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

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

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

// ExecuteResponse defines the output of the Execute step.
type ExecuteResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

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

func (x *ExecuteResponse) Reset() {
	*x = ExecuteResponse{}
	if protoimpl.UnsafeEnabled {
		mi := &file_test_platform_steps_execution_proto_msgTypes[3]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *ExecuteResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ExecuteResponse) ProtoMessage() {}

func (x *ExecuteResponse) ProtoReflect() protoreflect.Message {
	mi := &file_test_platform_steps_execution_proto_msgTypes[3]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ExecuteResponse.ProtoReflect.Descriptor instead.
func (*ExecuteResponse) Descriptor() ([]byte, []int) {
	return file_test_platform_steps_execution_proto_rawDescGZIP(), []int{3}
}

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

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

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

type ExecuteResponse_TaskResult struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// URL at which a human can view the task's run state (e.g. link to
	// swarming or cautotest job view).
	TaskUrl string                   `protobuf:"bytes,2,opt,name=task_url,json=taskUrl,proto3" json:"task_url,omitempty"`
	State   *test_platform.TaskState `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"`
	Name    string                   `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"`
	// URL at which a human can view the task's logs (e.g. a link to
	// stainless gs viewer for this task).
	LogUrl string `protobuf:"bytes,5,opt,name=log_url,json=logUrl,proto3" json:"log_url,omitempty"`
	// The attempt number, starting at 0.
	// Within an execution, the tuple (name, attempt) will be unique.
	Attempt int32 `protobuf:"varint,6,opt,name=attempt,proto3" json:"attempt,omitempty"`
	// The results of individual test cases that were executed as part of
	// the task.
	TestCases []*ExecuteResponse_TaskResult_TestCaseResult `protobuf:"bytes,7,rep,name=test_cases,json=testCases,proto3" json:"test_cases,omitempty"`
	// The results of steps run prior to running the actual tests
	// (e.g. provision).
	PrejobSteps []*ExecuteResponse_TaskResult_TestCaseResult `protobuf:"bytes,8,rep,name=prejob_steps,json=prejobSteps,proto3" json:"prejob_steps,omitempty"`
	// Logdata is the location at which the task's full output will
	// eventually be available. Not intended for human's to view; use
	// log_url instead.
	LogData *common.TaskLogData `protobuf:"bytes,9,opt,name=log_data,json=logData,proto3" json:"log_data,omitempty"`
	// Any rejected task dimensions from the task execution request,
	// stored as key-value pairs. This field is only populated if the
	// task was rejected by Swarming due to a lack of matching bot.
	// DEPRECATED: use rejected_dimensions instead, as it allows multiple
	// values for the same key. This will be deleted soon.
	// TODO(https://crbug.com/11798680)
	//
	// Deprecated: Do not use.
	RejectedTaskDimensions map[string]string `protobuf:"bytes,11,rep,name=rejected_task_dimensions,json=rejectedTaskDimensions,proto3" json:"rejected_task_dimensions,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
	// Any rejected task dimensions from the task execution request,
	// stored as key-value pairs. This field is only populated if the
	// task was rejected by Swarming due to a lack of matching bot.
	RejectedDimensions []*ExecuteResponse_TaskResult_RejectedTaskDimension `protobuf:"bytes,12,rep,name=rejected_dimensions,json=rejectedDimensions,proto3" json:"rejected_dimensions,omitempty"`
}

func (x *ExecuteResponse_TaskResult) Reset() {
	*x = ExecuteResponse_TaskResult{}
	if protoimpl.UnsafeEnabled {
		mi := &file_test_platform_steps_execution_proto_msgTypes[6]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *ExecuteResponse_TaskResult) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ExecuteResponse_TaskResult) ProtoMessage() {}

func (x *ExecuteResponse_TaskResult) ProtoReflect() protoreflect.Message {
	mi := &file_test_platform_steps_execution_proto_msgTypes[6]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ExecuteResponse_TaskResult.ProtoReflect.Descriptor instead.
func (*ExecuteResponse_TaskResult) Descriptor() ([]byte, []int) {
	return file_test_platform_steps_execution_proto_rawDescGZIP(), []int{3, 0}
}

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

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

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

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

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

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

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

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

// Deprecated: Do not use.
func (x *ExecuteResponse_TaskResult) GetRejectedTaskDimensions() map[string]string {
	if x != nil {
		return x.RejectedTaskDimensions
	}
	return nil
}

func (x *ExecuteResponse_TaskResult) GetRejectedDimensions() []*ExecuteResponse_TaskResult_RejectedTaskDimension {
	if x != nil {
		return x.RejectedDimensions
	}
	return nil
}

type ExecuteResponse_ConsolidatedResult struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// result for each attempt of the corresponding enumeration.
	Attempts []*ExecuteResponse_TaskResult `protobuf:"bytes,1,rep,name=attempts,proto3" json:"attempts,omitempty"`
}

func (x *ExecuteResponse_ConsolidatedResult) Reset() {
	*x = ExecuteResponse_ConsolidatedResult{}
	if protoimpl.UnsafeEnabled {
		mi := &file_test_platform_steps_execution_proto_msgTypes[7]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *ExecuteResponse_ConsolidatedResult) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ExecuteResponse_ConsolidatedResult) ProtoMessage() {}

func (x *ExecuteResponse_ConsolidatedResult) ProtoReflect() protoreflect.Message {
	mi := &file_test_platform_steps_execution_proto_msgTypes[7]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ExecuteResponse_ConsolidatedResult.ProtoReflect.Descriptor instead.
func (*ExecuteResponse_ConsolidatedResult) Descriptor() ([]byte, []int) {
	return file_test_platform_steps_execution_proto_rawDescGZIP(), []int{3, 1}
}

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

type ExecuteResponse_TaskResult_TestCaseResult struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

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

func (x *ExecuteResponse_TaskResult_TestCaseResult) Reset() {
	*x = ExecuteResponse_TaskResult_TestCaseResult{}
	if protoimpl.UnsafeEnabled {
		mi := &file_test_platform_steps_execution_proto_msgTypes[8]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *ExecuteResponse_TaskResult_TestCaseResult) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ExecuteResponse_TaskResult_TestCaseResult) ProtoMessage() {}

func (x *ExecuteResponse_TaskResult_TestCaseResult) ProtoReflect() protoreflect.Message {
	mi := &file_test_platform_steps_execution_proto_msgTypes[8]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ExecuteResponse_TaskResult_TestCaseResult.ProtoReflect.Descriptor instead.
func (*ExecuteResponse_TaskResult_TestCaseResult) Descriptor() ([]byte, []int) {
	return file_test_platform_steps_execution_proto_rawDescGZIP(), []int{3, 0, 0}
}

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

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

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

type ExecuteResponse_TaskResult_RejectedTaskDimension struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Key   string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"`
	Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
}

func (x *ExecuteResponse_TaskResult_RejectedTaskDimension) Reset() {
	*x = ExecuteResponse_TaskResult_RejectedTaskDimension{}
	if protoimpl.UnsafeEnabled {
		mi := &file_test_platform_steps_execution_proto_msgTypes[10]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *ExecuteResponse_TaskResult_RejectedTaskDimension) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ExecuteResponse_TaskResult_RejectedTaskDimension) ProtoMessage() {}

func (x *ExecuteResponse_TaskResult_RejectedTaskDimension) ProtoReflect() protoreflect.Message {
	mi := &file_test_platform_steps_execution_proto_msgTypes[10]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ExecuteResponse_TaskResult_RejectedTaskDimension.ProtoReflect.Descriptor instead.
func (*ExecuteResponse_TaskResult_RejectedTaskDimension) Descriptor() ([]byte, []int) {
	return file_test_platform_steps_execution_proto_rawDescGZIP(), []int{3, 0, 2}
}

func (x *ExecuteResponse_TaskResult_RejectedTaskDimension) GetKey() string {
	if x != nil {
		return x.Key
	}
	return ""
}

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

var File_test_platform_steps_execution_proto protoreflect.FileDescriptor

var file_test_platform_steps_execution_proto_rawDesc = []byte{
	0x0a, 0x23, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f,
	0x73, 0x74, 0x65, 0x70, 0x73, 0x2f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e,
	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x13, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74,
	0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x73, 0x74, 0x65, 0x70, 0x73, 0x1a, 0x1f, 0x74, 0x65, 0x73, 0x74,
	0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e,
	0x2f, 0x74, 0x61, 0x73, 0x6b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x21, 0x74, 0x65, 0x73,
	0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69,
	0x67, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b,
	0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f, 0x72, 0x65,
	0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x25, 0x74, 0x65, 0x73,
	0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f, 0x73, 0x74, 0x65, 0x70, 0x73,
	0x2f, 0x65, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f,
	0x74, 0x6f, 0x1a, 0x27, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72,
	0x6d, 0x2f, 0x73, 0x74, 0x65, 0x70, 0x73, 0x2f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x2f,
	0x62, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x74, 0x65, 0x73,
	0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f, 0x74, 0x61, 0x73, 0x6b, 0x73,
	0x74, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xd7, 0x02, 0x0a, 0x0f, 0x45,
	0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x12, 0x3f,
	0x0a, 0x08, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b,
	0x32, 0x23, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d,
	0x2e, 0x73, 0x74, 0x65, 0x70, 0x73, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x52, 0x65,
	0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x08, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x12,
	0x61, 0x0a, 0x0f, 0x74, 0x61, 0x67, 0x67, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73,
	0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f,
	0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x73, 0x74, 0x65, 0x70, 0x73, 0x2e, 0x45,
	0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x2e, 0x54,
	0x61, 0x67, 0x67, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x45, 0x6e, 0x74,
	0x72, 0x79, 0x52, 0x0e, 0x74, 0x61, 0x67, 0x67, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
	0x74, 0x73, 0x12, 0x38, 0x0a, 0x05, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28,
	0x0b, 0x32, 0x22, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72,
	0x6d, 0x2e, 0x73, 0x74, 0x65, 0x70, 0x73, 0x2e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x2e,
	0x42, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x05, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x1a, 0x66, 0x0a, 0x13,
	0x54, 0x61, 0x67, 0x67, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x45, 0x6e,
	0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
	0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x39, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02,
	0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74,
	0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x73, 0x74, 0x65, 0x70, 0x73, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75,
	0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65,
	0x3a, 0x02, 0x38, 0x01, 0x22, 0xa7, 0x02, 0x0a, 0x10, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65,
	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x12, 0x42, 0x0a, 0x09, 0x72, 0x65, 0x73,
	0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x74,
	0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x73, 0x74, 0x65,
	0x70, 0x73, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
	0x73, 0x65, 0x52, 0x09, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x12, 0x65, 0x0a,
	0x10, 0x74, 0x61, 0x67, 0x67, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
	0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70,
	0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x73, 0x74, 0x65, 0x70, 0x73, 0x2e, 0x45, 0x78,
	0x65, 0x63, 0x75, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x2e, 0x54,
	0x61, 0x67, 0x67, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x45, 0x6e,
	0x74, 0x72, 0x79, 0x52, 0x0f, 0x74, 0x61, 0x67, 0x67, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f,
	0x6e, 0x73, 0x65, 0x73, 0x1a, 0x68, 0x0a, 0x14, 0x54, 0x61, 0x67, 0x67, 0x65, 0x64, 0x52, 0x65,
	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03,
	0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x3a,
	0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e,
	0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x73, 0x74,
	0x65, 0x70, 0x73, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f,
	0x6e, 0x73, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd8,
	0x01, 0x0a, 0x0e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
	0x74, 0x12, 0x44, 0x0a, 0x0e, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x72,
	0x61, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x74, 0x65, 0x73, 0x74,
	0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
	0x74, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x0d, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73,
	0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x4a, 0x0a, 0x0b, 0x65, 0x6e, 0x75, 0x6d, 0x65,
	0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x74,
	0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x73, 0x74, 0x65,
	0x70, 0x73, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65,
	0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0b, 0x65, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x61, 0x74,
	0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x03, 0x20,
	0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66,
	0x6f, 0x72, 0x6d, 0x2e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69,
	0x67, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0xd2, 0x0a, 0x0a, 0x0f, 0x45, 0x78,
	0x65, 0x63, 0x75, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x56, 0x0a,
	0x0c, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20,
	0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66,
	0x6f, 0x72, 0x6d, 0x2e, 0x73, 0x74, 0x65, 0x70, 0x73, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74,
	0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65,
	0x73, 0x75, 0x6c, 0x74, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0b, 0x74, 0x61, 0x73, 0x6b, 0x52, 0x65,
	0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x6a, 0x0a, 0x14, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69,
	0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x03, 0x20,
	0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66,
	0x6f, 0x72, 0x6d, 0x2e, 0x73, 0x74, 0x65, 0x70, 0x73, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74,
	0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c,
	0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x13, 0x63, 0x6f,
	0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74,
	0x73, 0x12, 0x2e, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b,
	0x32, 0x18, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d,
	0x2e, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74,
	0x65, 0x1a, 0xe7, 0x07, 0x0a, 0x0a, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74,
	0x12, 0x19, 0x0a, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01,
	0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x55, 0x72, 0x6c, 0x12, 0x2e, 0x0a, 0x05, 0x73,
	0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x65, 0x73,
	0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x53,
	0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e,
	0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12,
	0x17, 0x0a, 0x07, 0x6c, 0x6f, 0x67, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09,
	0x52, 0x06, 0x6c, 0x6f, 0x67, 0x55, 0x72, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x74, 0x74, 0x65,
	0x6d, 0x70, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x61, 0x74, 0x74, 0x65, 0x6d,
	0x70, 0x74, 0x12, 0x5d, 0x0a, 0x0a, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x63, 0x61, 0x73, 0x65, 0x73,
	0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c,
	0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x73, 0x74, 0x65, 0x70, 0x73, 0x2e, 0x45, 0x78, 0x65,
	0x63, 0x75, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, 0x73,
	0x6b, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65,
	0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x09, 0x74, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73, 0x65,
	0x73, 0x12, 0x61, 0x0a, 0x0c, 0x70, 0x72, 0x65, 0x6a, 0x6f, 0x62, 0x5f, 0x73, 0x74, 0x65, 0x70,
	0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70,
	0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x73, 0x74, 0x65, 0x70, 0x73, 0x2e, 0x45, 0x78,
	0x65, 0x63, 0x75, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61,
	0x73, 0x6b, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x43, 0x61, 0x73,
	0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x0b, 0x70, 0x72, 0x65, 0x6a, 0x6f, 0x62, 0x53,
	0x74, 0x65, 0x70, 0x73, 0x12, 0x3c, 0x0a, 0x08, 0x6c, 0x6f, 0x67, 0x5f, 0x64, 0x61, 0x74, 0x61,
	0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c,
	0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x54, 0x61,
	0x73, 0x6b, 0x4c, 0x6f, 0x67, 0x44, 0x61, 0x74, 0x61, 0x52, 0x07, 0x6c, 0x6f, 0x67, 0x44, 0x61,
	0x74, 0x61, 0x12, 0x89, 0x01, 0x0a, 0x18, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f,
	0x74, 0x61, 0x73, 0x6b, 0x5f, 0x64, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18,
	0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x4b, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61,
	0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x73, 0x74, 0x65, 0x70, 0x73, 0x2e, 0x45, 0x78, 0x65, 0x63,
	0x75, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, 0x73, 0x6b,
	0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x52, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x64, 0x54,
	0x61, 0x73, 0x6b, 0x44, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74,
	0x72, 0x79, 0x42, 0x02, 0x18, 0x01, 0x52, 0x16, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x64,
	0x54, 0x61, 0x73, 0x6b, 0x44, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x76,
	0x0a, 0x13, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x64, 0x69, 0x6d, 0x65, 0x6e,
	0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x45, 0x2e, 0x74, 0x65,
	0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x73, 0x74, 0x65, 0x70,
	0x73, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
	0x65, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x52, 0x65, 0x6a,
	0x65, 0x63, 0x74, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69,
	0x6f, 0x6e, 0x52, 0x12, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x64, 0x44, 0x69, 0x6d, 0x65,
	0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x96, 0x01, 0x0a, 0x0e, 0x54, 0x65, 0x73, 0x74, 0x43,
	0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d,
	0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3a, 0x0a,
	0x07, 0x76, 0x65, 0x72, 0x64, 0x69, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20,
	0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x54,
	0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x56, 0x65, 0x72, 0x64, 0x69, 0x63, 0x74,
	0x52, 0x07, 0x76, 0x65, 0x72, 0x64, 0x69, 0x63, 0x74, 0x12, 0x34, 0x0a, 0x16, 0x68, 0x75, 0x6d,
	0x61, 0x6e, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x75, 0x6d, 0x6d,
	0x61, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x68, 0x75, 0x6d, 0x61, 0x6e,
	0x52, 0x65, 0x61, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x1a,
	0x49, 0x0a, 0x1b, 0x52, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x44,
	0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10,
	0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79,
	0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
	0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3f, 0x0a, 0x15, 0x52, 0x65,
	0x6a, 0x65, 0x63, 0x74, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x69, 0x6d, 0x65, 0x6e, 0x73,
	0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
	0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02,
	0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x4a, 0x04, 0x08, 0x0a, 0x10,
	0x0b, 0x52, 0x18, 0x73, 0x79, 0x6e, 0x63, 0x68, 0x72, 0x6f, 0x6e, 0x6f, 0x75, 0x73, 0x5f, 0x6c,
	0x6f, 0x67, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x75, 0x72, 0x6c, 0x1a, 0x61, 0x0a, 0x12, 0x43,
	0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x73, 0x75, 0x6c,
	0x74, 0x12, 0x4b, 0x0a, 0x08, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x73, 0x18, 0x01, 0x20,
	0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66,
	0x6f, 0x72, 0x6d, 0x2e, 0x73, 0x74, 0x65, 0x70, 0x73, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74,
	0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65,
	0x73, 0x75, 0x6c, 0x74, 0x52, 0x08, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x73, 0x42, 0x3f,
	0x5a, 0x3d, 0x67, 0x6f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x2e, 0x6f, 0x72,
	0x67, 0x2f, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2f, 0x69, 0x6e, 0x66,
	0x72, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x74, 0x65, 0x73, 0x74,
	0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f, 0x73, 0x74, 0x65, 0x70, 0x73, 0x62,
	0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_test_platform_steps_execution_proto_rawDescOnce sync.Once
	file_test_platform_steps_execution_proto_rawDescData = file_test_platform_steps_execution_proto_rawDesc
)

func file_test_platform_steps_execution_proto_rawDescGZIP() []byte {
	file_test_platform_steps_execution_proto_rawDescOnce.Do(func() {
		file_test_platform_steps_execution_proto_rawDescData = protoimpl.X.CompressGZIP(file_test_platform_steps_execution_proto_rawDescData)
	})
	return file_test_platform_steps_execution_proto_rawDescData
}

var file_test_platform_steps_execution_proto_msgTypes = make([]protoimpl.MessageInfo, 11)
var file_test_platform_steps_execution_proto_goTypes = []interface{}{
	(*ExecuteRequests)(nil),            // 0: test_platform.steps.ExecuteRequests
	(*ExecuteResponses)(nil),           // 1: test_platform.steps.ExecuteResponses
	(*ExecuteRequest)(nil),             // 2: test_platform.steps.ExecuteRequest
	(*ExecuteResponse)(nil),            // 3: test_platform.steps.ExecuteResponse
	nil,                                // 4: test_platform.steps.ExecuteRequests.TaggedRequestsEntry
	nil,                                // 5: test_platform.steps.ExecuteResponses.TaggedResponsesEntry
	(*ExecuteResponse_TaskResult)(nil), // 6: test_platform.steps.ExecuteResponse.TaskResult
	(*ExecuteResponse_ConsolidatedResult)(nil),        // 7: test_platform.steps.ExecuteResponse.ConsolidatedResult
	(*ExecuteResponse_TaskResult_TestCaseResult)(nil), // 8: test_platform.steps.ExecuteResponse.TaskResult.TestCaseResult
	nil, // 9: test_platform.steps.ExecuteResponse.TaskResult.RejectedTaskDimensionsEntry
	(*ExecuteResponse_TaskResult_RejectedTaskDimension)(nil), // 10: test_platform.steps.ExecuteResponse.TaskResult.RejectedTaskDimension
	(*execute.Build)(nil),                // 11: test_platform.steps.execute.Build
	(*test_platform.Request_Params)(nil), // 12: test_platform.Request.Params
	(*EnumerationResponse)(nil),          // 13: test_platform.steps.EnumerationResponse
	(*config.Config)(nil),                // 14: test_platform.config.Config
	(*test_platform.TaskState)(nil),      // 15: test_platform.TaskState
	(*common.TaskLogData)(nil),           // 16: test_platform.common.TaskLogData
	(test_platform.TaskState_Verdict)(0), // 17: test_platform.TaskState.Verdict
}
var file_test_platform_steps_execution_proto_depIdxs = []int32{
	2,  // 0: test_platform.steps.ExecuteRequests.requests:type_name -> test_platform.steps.ExecuteRequest
	4,  // 1: test_platform.steps.ExecuteRequests.tagged_requests:type_name -> test_platform.steps.ExecuteRequests.TaggedRequestsEntry
	11, // 2: test_platform.steps.ExecuteRequests.build:type_name -> test_platform.steps.execute.Build
	3,  // 3: test_platform.steps.ExecuteResponses.responses:type_name -> test_platform.steps.ExecuteResponse
	5,  // 4: test_platform.steps.ExecuteResponses.tagged_responses:type_name -> test_platform.steps.ExecuteResponses.TaggedResponsesEntry
	12, // 5: test_platform.steps.ExecuteRequest.request_params:type_name -> test_platform.Request.Params
	13, // 6: test_platform.steps.ExecuteRequest.enumeration:type_name -> test_platform.steps.EnumerationResponse
	14, // 7: test_platform.steps.ExecuteRequest.config:type_name -> test_platform.config.Config
	6,  // 8: test_platform.steps.ExecuteResponse.task_results:type_name -> test_platform.steps.ExecuteResponse.TaskResult
	7,  // 9: test_platform.steps.ExecuteResponse.consolidated_results:type_name -> test_platform.steps.ExecuteResponse.ConsolidatedResult
	15, // 10: test_platform.steps.ExecuteResponse.state:type_name -> test_platform.TaskState
	2,  // 11: test_platform.steps.ExecuteRequests.TaggedRequestsEntry.value:type_name -> test_platform.steps.ExecuteRequest
	3,  // 12: test_platform.steps.ExecuteResponses.TaggedResponsesEntry.value:type_name -> test_platform.steps.ExecuteResponse
	15, // 13: test_platform.steps.ExecuteResponse.TaskResult.state:type_name -> test_platform.TaskState
	8,  // 14: test_platform.steps.ExecuteResponse.TaskResult.test_cases:type_name -> test_platform.steps.ExecuteResponse.TaskResult.TestCaseResult
	8,  // 15: test_platform.steps.ExecuteResponse.TaskResult.prejob_steps:type_name -> test_platform.steps.ExecuteResponse.TaskResult.TestCaseResult
	16, // 16: test_platform.steps.ExecuteResponse.TaskResult.log_data:type_name -> test_platform.common.TaskLogData
	9,  // 17: test_platform.steps.ExecuteResponse.TaskResult.rejected_task_dimensions:type_name -> test_platform.steps.ExecuteResponse.TaskResult.RejectedTaskDimensionsEntry
	10, // 18: test_platform.steps.ExecuteResponse.TaskResult.rejected_dimensions:type_name -> test_platform.steps.ExecuteResponse.TaskResult.RejectedTaskDimension
	6,  // 19: test_platform.steps.ExecuteResponse.ConsolidatedResult.attempts:type_name -> test_platform.steps.ExecuteResponse.TaskResult
	17, // 20: test_platform.steps.ExecuteResponse.TaskResult.TestCaseResult.verdict:type_name -> test_platform.TaskState.Verdict
	21, // [21:21] is the sub-list for method output_type
	21, // [21:21] is the sub-list for method input_type
	21, // [21:21] is the sub-list for extension type_name
	21, // [21:21] is the sub-list for extension extendee
	0,  // [0:21] is the sub-list for field type_name
}

func init() { file_test_platform_steps_execution_proto_init() }
func file_test_platform_steps_execution_proto_init() {
	if File_test_platform_steps_execution_proto != nil {
		return
	}
	file_test_platform_steps_enumeration_proto_init()
	if !protoimpl.UnsafeEnabled {
		file_test_platform_steps_execution_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ExecuteRequests); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_test_platform_steps_execution_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ExecuteResponses); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_test_platform_steps_execution_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ExecuteRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_test_platform_steps_execution_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ExecuteResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_test_platform_steps_execution_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ExecuteResponse_TaskResult); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_test_platform_steps_execution_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ExecuteResponse_ConsolidatedResult); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_test_platform_steps_execution_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ExecuteResponse_TaskResult_TestCaseResult); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_test_platform_steps_execution_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ExecuteResponse_TaskResult_RejectedTaskDimension); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_test_platform_steps_execution_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   11,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_test_platform_steps_execution_proto_goTypes,
		DependencyIndexes: file_test_platform_steps_execution_proto_depIdxs,
		MessageInfos:      file_test_platform_steps_execution_proto_msgTypes,
	}.Build()
	File_test_platform_steps_execution_proto = out.File
	file_test_platform_steps_execution_proto_rawDesc = nil
	file_test_platform_steps_execution_proto_goTypes = nil
	file_test_platform_steps_execution_proto_depIdxs = nil
}
