From 8b164c1bba44c74f9cff0228a430ada9236b3c21 Mon Sep 17 00:00:00 2001 From: Robert Date: Mon, 27 Jan 2025 10:26:00 +0000 Subject: [PATCH 01/18] Included llm spec into operator --- operator/apis/mlops/v1alpha1/model_types.go | 18 +++++++++++ .../apis/mlops/v1alpha1/model_types_test.go | 8 ++++- .../mlops/v1alpha1/zz_generated.deepcopy.go | 31 +++++++++++++++++++ .../crd/bases/mlops.seldon.io_models.yaml | 12 +++++++ 4 files changed, 68 insertions(+), 1 deletion(-) diff --git a/operator/apis/mlops/v1alpha1/model_types.go b/operator/apis/mlops/v1alpha1/model_types.go index 0437c85f1c..c49ee61007 100644 --- a/operator/apis/mlops/v1alpha1/model_types.go +++ b/operator/apis/mlops/v1alpha1/model_types.go @@ -44,6 +44,8 @@ type ModelSpec struct { Explainer *ExplainerSpec `json:"explainer,omitempty"` // Parameters to load with model Parameters []ParameterSpec `json:"parameters,omitempty"` + // Llm spec + Llm *LlmSpec `json:"llm,omitempty"` } type ParameterSpec struct { @@ -64,6 +66,16 @@ type ExplainerSpec struct { PipelineRef *string `json:"pipelineRef,omitempty"` } +// Either ModelRef or PipelineRef is required +type LlmSpec struct { + // Reference to Model + // +optional + ModelRef *string `json:"modelRef,omitempty"` + // Reference to Pipeline + // +optional + PipelineRef *string `json:"pipelineRef,omitempty"` +} + type ScalingSpec struct { // Number of replicas - default 1 Replicas *int32 `json:"replicas,omitempty"` @@ -168,6 +180,12 @@ func (m Model) AsSchedulerModel() (*scheduler.Model, error) { PipelineRef: m.Spec.Explainer.PipelineRef, } } + if m.Spec.Llm != nil { + md.ModelSpec.Llm = &scheduler.LLMSpec{ + ModelRef: m.Spec.Llm.ModelRef, + PipelineRef: m.Spec.Llm.PipelineRef, + } + } if len(m.Spec.Parameters) > 0 { var parameters []*scheduler.ParameterSpec for _, param := range m.Spec.Parameters { diff --git a/operator/apis/mlops/v1alpha1/model_types_test.go b/operator/apis/mlops/v1alpha1/model_types_test.go index 014ac2152e..897bb15f44 100644 --- a/operator/apis/mlops/v1alpha1/model_types_test.go +++ b/operator/apis/mlops/v1alpha1/model_types_test.go @@ -39,7 +39,7 @@ func TestAsModelDetails(t *testing.T) { server := "server" m1 := resource.MustParse("1M") m1bytes := uint64(1_000_000) - incomeModel := "income" + incomeModel, llmModel := "income", "chat-gpt" tests := []test{ { name: "simple", @@ -96,6 +96,9 @@ func TestAsModelDetails(t *testing.T) { Type: "anchor_tabular", ModelRef: &incomeModel, }, + Llm: &LlmSpec{ + ModelRef: &llmModel, + }, Parameters: []ParameterSpec{ { Name: "foo", @@ -125,6 +128,9 @@ func TestAsModelDetails(t *testing.T) { Type: "anchor_tabular", ModelRef: &incomeModel, }, + Llm: &scheduler.LLMSpec{ + ModelRef: &llmModel, + }, Parameters: []*scheduler.ParameterSpec{ { Name: "foo", diff --git a/operator/apis/mlops/v1alpha1/zz_generated.deepcopy.go b/operator/apis/mlops/v1alpha1/zz_generated.deepcopy.go index 772b842d1a..791aebe0f8 100644 --- a/operator/apis/mlops/v1alpha1/zz_generated.deepcopy.go +++ b/operator/apis/mlops/v1alpha1/zz_generated.deepcopy.go @@ -1,4 +1,5 @@ //go:build !ignore_autogenerated +// +build !ignore_autogenerated /* Copyright (c) 2024 Seldon Technologies Ltd. @@ -338,6 +339,31 @@ func (in *KafkaConfig) DeepCopy() *KafkaConfig { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *LlmSpec) DeepCopyInto(out *LlmSpec) { + *out = *in + if in.ModelRef != nil { + in, out := &in.ModelRef, &out.ModelRef + *out = new(string) + **out = **in + } + if in.PipelineRef != nil { + in, out := &in.PipelineRef, &out.PipelineRef + *out = new(string) + **out = **in + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LLMSpec. +func (in *LlmSpec) DeepCopy() *LlmSpec { + if in == nil { + return nil + } + out := new(LlmSpec) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *LoggingSpec) DeepCopyInto(out *LoggingSpec) { *out = *in @@ -452,6 +478,11 @@ func (in *ModelSpec) DeepCopyInto(out *ModelSpec) { *out = make([]ParameterSpec, len(*in)) copy(*out, *in) } + if in.Llm != nil { + in, out := &in.Llm, &out.Llm + *out = new(LlmSpec) + (*in).DeepCopyInto(*out) + } } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new ModelSpec. diff --git a/operator/config/crd/bases/mlops.seldon.io_models.yaml b/operator/config/crd/bases/mlops.seldon.io_models.yaml index 80ffb017e4..9581c375a3 100644 --- a/operator/config/crd/bases/mlops.seldon.io_models.yaml +++ b/operator/config/crd/bases/mlops.seldon.io_models.yaml @@ -79,6 +79,18 @@ spec: description: type of explainer type: string type: object + llm: + description: LLMs spec + properties: + modelRef: + description: |- + one of the following need to be set for LLMs + Reference to Model + type: string + pipelineRef: + description: Reference to Pipeline + type: string + type: object logger: description: Payload logging properties: From 5ce2bee8e2b9d7dfaa889829564feb4763eae40a Mon Sep 17 00:00:00 2001 From: Robert Date: Mon, 27 Jan 2025 11:05:52 +0000 Subject: [PATCH 02/18] Implemented SetLlm in scheduler and included associated test --- .../pkg/agent/repository/mlserver/mlserver.go | 42 ++++++++++++++ .../repository/mlserver/mlserver_test.go | 56 +++++++++++++++++++ .../pkg/agent/repository/model_repository.go | 15 +++++ .../pkg/agent/repository/triton/triton.go | 4 ++ 4 files changed, 117 insertions(+) diff --git a/scheduler/pkg/agent/repository/mlserver/mlserver.go b/scheduler/pkg/agent/repository/mlserver/mlserver.go index 8b8cb494b3..6acd974e29 100644 --- a/scheduler/pkg/agent/repository/mlserver/mlserver.go +++ b/scheduler/pkg/agent/repository/mlserver/mlserver.go @@ -198,6 +198,48 @@ func (m *MLServerRepositoryHandler) SetExplainer(modelRepoPath string, explainer return nil } +func (m *MLServerRepositoryHandler) SetLlm(modelRepoPath string, llmSpec *scheduler.LlmSpec, envoyHost string, envoyPort int) error { + if llmSpec != nil { + workers := 0 + settingsPath := filepath.Join(modelRepoPath, mlserverConfigFilename) + ms, err := m.loadModelSettingsFromFile(settingsPath) + if err != nil { + return err + } + + ms.ParallelWorkers = &workers + if ms.Parameters == nil { + ms.Parameters = &ModelParameters{} + } + + if ms.Parameters.Extra == nil { + ms.Parameters.Extra = map[string]interface{}{} + } + + scheme := "http" + if m.SSL { + scheme = "https" + ms.Parameters.Extra[sslVerifyPath] = "/mnt/certs/ca.crt" + } + if llmSpec.ModelRef != nil { + inferUri := fmt.Sprintf("%s://%s:%d/v2/models/%s/infer", scheme, envoyHost, envoyPort, *llmSpec.ModelRef) + ms.Parameters.Extra["url"] = &inferUri + } else if llmSpec.PipelineRef != nil { + inferUri := fmt.Sprintf("%s://%s:%d/v2/models/%s/infer", scheme, envoyHost, envoyPort, *llmSpec.ModelRef) + ms.Parameters.Extra["url"] = &inferUri + } + + data, err := json.Marshal(ms) + if err != nil { + return err + } + return os.WriteFile(settingsPath, data, fs.ModePerm) + + } + return nil + +} + func (m *MLServerRepositoryHandler) SetExtraParameters(modelRepoPath string, parameters []*scheduler.ParameterSpec) error { settingsPath := filepath.Join(modelRepoPath, mlserverConfigFilename) ms, err := m.loadModelSettingsFromFile(settingsPath) diff --git a/scheduler/pkg/agent/repository/mlserver/mlserver_test.go b/scheduler/pkg/agent/repository/mlserver/mlserver_test.go index e395aac6e8..2eeab930c2 100644 --- a/scheduler/pkg/agent/repository/mlserver/mlserver_test.go +++ b/scheduler/pkg/agent/repository/mlserver/mlserver_test.go @@ -96,6 +96,62 @@ func TestSetExplainer(t *testing.T) { } } +func TestSetLlm(t *testing.T) { + g := NewGomegaWithT(t) + + envoyHost := "0.0.0.0" + envoyPort := 9000 + type test struct { + name string + data []byte + llmSpec *scheduler.LlmSpec + expected *ModelSettings + } + + getStrPr := func(str string) *string { return &str } + tests := []test{ + { + name: "chat-completion", + data: []byte(`{"name": "chat-completion","implementation": "mlserver_prompt_utils.runtime.PromptRuntime", +"parameters": {"version": "1", "extra":{"prompt_utils": {"model_type": "chat.completions"}}}}`), + llmSpec: &scheduler.LlmSpec{ + ModelRef: getStrPr("mymodel"), + }, + expected: &ModelSettings{ + Name: "chat-completion", + Implementation: "mlserver_prompt_utils.runtime.PromptRuntime", + Parameters: &ModelParameters{ + Version: "1", + Extra: map[string]interface{}{ + "url": "http://0.0.0.0:9000/v2/models/mymodel/infer", + "prompt_utils": map[string]interface{}{ + "model_type": "chat.completions", + }, + }, + }, + }, + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + modelRepoPath := t.TempDir() + settingsFile := filepath.Join(modelRepoPath, mlserverConfigFilename) + err := os.WriteFile(settingsFile, test.data, os.ModePerm) + g.Expect(err).To(BeNil()) + m := &MLServerRepositoryHandler{} + err = m.SetLlm(modelRepoPath, test.llmSpec, envoyHost, envoyPort) + g.Expect(err).To(BeNil()) + modelSettings, err := m.loadModelSettingsFromFile(settingsFile) + g.Expect(err).To(BeNil()) + g.Expect(modelSettings.Parameters.Extra["url"]).To(Equal(test.expected.Parameters.Extra["url"])) + g.Expect(modelSettings.Parameters.Extra["prompt_utils"]).To(Equal(test.expected.Parameters.Extra["prompt_utils"])) + + }) + } + +} + func TestLoadFromBytes(t *testing.T) { g := NewGomegaWithT(t) diff --git a/scheduler/pkg/agent/repository/model_repository.go b/scheduler/pkg/agent/repository/model_repository.go index f420592d19..a530d6ca34 100644 --- a/scheduler/pkg/agent/repository/model_repository.go +++ b/scheduler/pkg/agent/repository/model_repository.go @@ -28,6 +28,7 @@ type ModelRepositoryHandler interface { UpdateModelVersion(modelName string, version uint32, path string, modelSpec *scheduler.ModelSpec) error UpdateModelRepository(modelName string, path string, isVersionFolder bool, modelRepoPath string) error SetExplainer(modelRepoPath string, explainerSpec *scheduler.ExplainerSpec, envoyHost string, envoyPort int) error + SetLlm(modelRepoPath string, llmSpec *scheduler.LlmSpec, envoyHost string, envoyPort int) error SetExtraParameters(modelRepoPath string, parameters []*scheduler.ParameterSpec) error GetModelRuntimeInfo(path string) (*scheduler.ModelRuntimeInfo, error) } @@ -82,6 +83,7 @@ func (r *V2ModelRepository) DownloadModelVersion( artifactVersion := modelSpec.ArtifactVersion srcUri := modelSpec.Uri explainerSpec := modelSpec.GetExplainer() + llmSpec := modelSpec.GetLlm() parameters := modelSpec.GetParameters() logger.Debugf("running with model %s:%d srcUri %s", modelName, version, srcUri) @@ -165,6 +167,19 @@ func (r *V2ModelRepository) DownloadModelVersion( } } + // Update details for LLM + if llmSpec != nil { + err = r.modelRepositoryHandler.SetLlm( + modelVersionPathInRepo, + llmSpec, + r.envoyHost, + r.envoyPort, + ) + if err != nil { + return nil, err + } + } + // Set init parameters inside model err = r.modelRepositoryHandler.SetExtraParameters(modelVersionPathInRepo, parameters) if err != nil { diff --git a/scheduler/pkg/agent/repository/triton/triton.go b/scheduler/pkg/agent/repository/triton/triton.go index c06ed0dfbc..a8e8598a98 100644 --- a/scheduler/pkg/agent/repository/triton/triton.go +++ b/scheduler/pkg/agent/repository/triton/triton.go @@ -215,6 +215,10 @@ func (t *TritonRepositoryHandler) SetExplainer(modelRepoPath string, explainerSp return nil } +func (t *TritonRepositoryHandler) SetLlm(modelRepoPath string, llmSpec *scheduler.LlmSpec, envoyHost string, envoyPort int) error { + return nil +} + func (t *TritonRepositoryHandler) SetExtraParameters(modelRepoPath string, parameters []*scheduler.ParameterSpec) error { return nil } From b28dc1561220d3df8a5f1c037aad0961fdf5b2fe Mon Sep 17 00:00:00 2001 From: Robert Date: Mon, 27 Jan 2025 11:09:57 +0000 Subject: [PATCH 03/18] Generated protocol buffers --- apis/go/mlops/scheduler/scheduler.pb.go | 905 +++++++++++++----------- apis/mlops/scheduler/scheduler.proto | 10 +- 2 files changed, 505 insertions(+), 410 deletions(-) diff --git a/apis/go/mlops/scheduler/scheduler.pb.go b/apis/go/mlops/scheduler/scheduler.pb.go index 9d8675fa6d..24589e0134 100644 --- a/apis/go/mlops/scheduler/scheduler.pb.go +++ b/apis/go/mlops/scheduler/scheduler.pb.go @@ -137,7 +137,7 @@ func (x ModelStatus_ModelState) Number() protoreflect.EnumNumber { // Deprecated: Use ModelStatus_ModelState.Descriptor instead. func (ModelStatus_ModelState) EnumDescriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{20, 0} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{21, 0} } type ModelReplicaStatus_ModelReplicaState int32 @@ -216,7 +216,7 @@ func (x ModelReplicaStatus_ModelReplicaState) Number() protoreflect.EnumNumber { // Deprecated: Use ModelReplicaStatus_ModelReplicaState.Descriptor instead. func (ModelReplicaStatus_ModelReplicaState) EnumDescriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{21, 0} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{22, 0} } // Type of SterverStatus update. At the moment the scheduler doesn't combine multiple types of @@ -272,7 +272,7 @@ func (x ServerStatusResponse_Type) Number() protoreflect.EnumNumber { // Deprecated: Use ServerStatusResponse_Type.Descriptor instead. func (ServerStatusResponse_Type) EnumDescriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{23, 0} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{24, 0} } type PipelineStep_JoinOp int32 @@ -321,7 +321,7 @@ func (x PipelineStep_JoinOp) Number() protoreflect.EnumNumber { // Deprecated: Use PipelineStep_JoinOp.Descriptor instead. func (PipelineStep_JoinOp) EnumDescriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{44, 0} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{45, 0} } type PipelineInput_JoinOp int32 @@ -370,7 +370,7 @@ func (x PipelineInput_JoinOp) Number() protoreflect.EnumNumber { // Deprecated: Use PipelineInput_JoinOp.Descriptor instead. func (PipelineInput_JoinOp) EnumDescriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{46, 0} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{47, 0} } type PipelineOutput_JoinOp int32 @@ -419,7 +419,7 @@ func (x PipelineOutput_JoinOp) Number() protoreflect.EnumNumber { // Deprecated: Use PipelineOutput_JoinOp.Descriptor instead. func (PipelineOutput_JoinOp) EnumDescriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{47, 0} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{48, 0} } type PipelineVersionState_PipelineStatus int32 @@ -483,7 +483,7 @@ func (x PipelineVersionState_PipelineStatus) Number() protoreflect.EnumNumber { // Deprecated: Use PipelineVersionState_PipelineStatus.Descriptor instead. func (PipelineVersionState_PipelineStatus) EnumDescriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{55, 0} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{56, 0} } type ControlPlaneResponse_Event int32 @@ -532,7 +532,7 @@ func (x ControlPlaneResponse_Event) Number() protoreflect.EnumNumber { // Deprecated: Use ControlPlaneResponse_Event.Descriptor instead. func (ControlPlaneResponse_Event) EnumDescriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{59, 0} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{60, 0} } type LoadModelRequest struct { @@ -801,15 +801,16 @@ type ModelSpec struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Uri string `protobuf:"bytes,1,opt,name=uri,proto3" json:"uri,omitempty"` // storage uri from where to download the artifacts - ArtifactVersion *uint32 `protobuf:"varint,2,opt,name=artifactVersion,proto3,oneof" json:"artifactVersion,omitempty"` // Optional v2 version folder to select - StorageConfig *StorageConfig `protobuf:"bytes,3,opt,name=storageConfig,proto3,oneof" json:"storageConfig,omitempty"` // Storage auth configuration - Requirements []string `protobuf:"bytes,4,rep,name=requirements,proto3" json:"requirements,omitempty"` // list of capabilities the server must satisfy to run this model - MemoryBytes *uint64 `protobuf:"varint,5,opt,name=memoryBytes,proto3,oneof" json:"memoryBytes,omitempty"` // Requested memory - Server *string `protobuf:"bytes,6,opt,name=server,proto3,oneof" json:"server,omitempty"` // the particular model server to load the model. If unspecified will be chosen. - Explainer *ExplainerSpec `protobuf:"bytes,7,opt,name=explainer,proto3,oneof" json:"explainer,omitempty"` // optional black box explainer details - Parameters []*ParameterSpec `protobuf:"bytes,8,rep,name=parameters,proto3" json:"parameters,omitempty"` // parameters to load with model - ModelRuntimeInfo *ModelRuntimeInfo `protobuf:"bytes,9,opt,name=modelRuntimeInfo,proto3,oneof" json:"modelRuntimeInfo,omitempty"` // model specific settings that are sent by the agent + Uri string `protobuf:"bytes,1,opt,name=uri,proto3" json:"uri,omitempty"` // storage uri from where to download the artifacts + ArtifactVersion *uint32 `protobuf:"varint,2,opt,name=artifactVersion,proto3,oneof" json:"artifactVersion,omitempty"` // Optional v2 version folder to select + StorageConfig *StorageConfig `protobuf:"bytes,3,opt,name=storageConfig,proto3,oneof" json:"storageConfig,omitempty"` // Storage auth configuration + Requirements []string `protobuf:"bytes,4,rep,name=requirements,proto3" json:"requirements,omitempty"` // list of capabilities the server must satisfy to run this model + MemoryBytes *uint64 `protobuf:"varint,5,opt,name=memoryBytes,proto3,oneof" json:"memoryBytes,omitempty"` // Requested memory + Server *string `protobuf:"bytes,6,opt,name=server,proto3,oneof" json:"server,omitempty"` // the particular model server to load the model. If unspecified will be chosen. + Explainer *ExplainerSpec `protobuf:"bytes,7,opt,name=explainer,proto3,oneof" json:"explainer,omitempty"` // optional black box explainer details + Llm *LlmSpec `protobuf:"bytes,8,opt,name=llm,proto3,oneof" json:"llm,omitempty"` // LLM specific settings + Parameters []*ParameterSpec `protobuf:"bytes,9,rep,name=parameters,proto3" json:"parameters,omitempty"` // parameters to load with model + ModelRuntimeInfo *ModelRuntimeInfo `protobuf:"bytes,10,opt,name=modelRuntimeInfo,proto3,oneof" json:"modelRuntimeInfo,omitempty"` // model specific settings that are sent by the agent } func (x *ModelSpec) Reset() { @@ -893,6 +894,13 @@ func (x *ModelSpec) GetExplainer() *ExplainerSpec { return nil } +func (x *ModelSpec) GetLlm() *LlmSpec { + if x != nil { + return x.Llm + } + return nil +} + func (x *ModelSpec) GetParameters() []*ParameterSpec { if x != nil { return x.Parameters @@ -1026,6 +1034,61 @@ func (x *ExplainerSpec) GetPipelineRef() string { return "" } +type LlmSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ModelRef *string `protobuf:"bytes,1,opt,name=modelRef,proto3,oneof" json:"modelRef,omitempty"` + PipelineRef *string `protobuf:"bytes,2,opt,name=pipelineRef,proto3,oneof" json:"pipelineRef,omitempty"` +} + +func (x *LlmSpec) Reset() { + *x = LlmSpec{} + if protoimpl.UnsafeEnabled { + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *LlmSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LlmSpec) ProtoMessage() {} + +func (x *LlmSpec) ProtoReflect() protoreflect.Message { + mi := &file_mlops_scheduler_scheduler_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 LlmSpec.ProtoReflect.Descriptor instead. +func (*LlmSpec) Descriptor() ([]byte, []int) { + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{7} +} + +func (x *LlmSpec) GetModelRef() string { + if x != nil && x.ModelRef != nil { + return *x.ModelRef + } + return "" +} + +func (x *LlmSpec) GetPipelineRef() string { + if x != nil && x.PipelineRef != nil { + return *x.PipelineRef + } + return "" +} + type ModelRuntimeInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1041,7 +1104,7 @@ type ModelRuntimeInfo struct { func (x *ModelRuntimeInfo) Reset() { *x = ModelRuntimeInfo{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[7] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1054,7 +1117,7 @@ func (x *ModelRuntimeInfo) String() string { func (*ModelRuntimeInfo) ProtoMessage() {} func (x *ModelRuntimeInfo) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[7] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1067,7 +1130,7 @@ func (x *ModelRuntimeInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use ModelRuntimeInfo.ProtoReflect.Descriptor instead. func (*ModelRuntimeInfo) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{7} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{8} } func (m *ModelRuntimeInfo) GetModelRuntimeInfo() isModelRuntimeInfo_ModelRuntimeInfo { @@ -1118,7 +1181,7 @@ type MLServerModelSettings struct { func (x *MLServerModelSettings) Reset() { *x = MLServerModelSettings{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[8] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1131,7 +1194,7 @@ func (x *MLServerModelSettings) String() string { func (*MLServerModelSettings) ProtoMessage() {} func (x *MLServerModelSettings) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[8] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1144,7 +1207,7 @@ func (x *MLServerModelSettings) ProtoReflect() protoreflect.Message { // Deprecated: Use MLServerModelSettings.ProtoReflect.Descriptor instead. func (*MLServerModelSettings) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{8} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{9} } func (x *MLServerModelSettings) GetParallelWorkers() uint32 { @@ -1165,7 +1228,7 @@ type TritonModelConfig struct { func (x *TritonModelConfig) Reset() { *x = TritonModelConfig{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[9] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1178,7 +1241,7 @@ func (x *TritonModelConfig) String() string { func (*TritonModelConfig) ProtoMessage() {} func (x *TritonModelConfig) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[9] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1191,7 +1254,7 @@ func (x *TritonModelConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use TritonModelConfig.ProtoReflect.Descriptor instead. func (*TritonModelConfig) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{9} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{10} } func (x *TritonModelConfig) GetCpu() []*TritonCPU { @@ -1212,7 +1275,7 @@ type TritonCPU struct { func (x *TritonCPU) Reset() { *x = TritonCPU{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[10] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1225,7 +1288,7 @@ func (x *TritonCPU) String() string { func (*TritonCPU) ProtoMessage() {} func (x *TritonCPU) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[10] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1238,7 +1301,7 @@ func (x *TritonCPU) ProtoReflect() protoreflect.Message { // Deprecated: Use TritonCPU.ProtoReflect.Descriptor instead. func (*TritonCPU) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{10} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{11} } func (x *TritonCPU) GetInstanceCount() uint32 { @@ -1260,7 +1323,7 @@ type KubernetesMeta struct { func (x *KubernetesMeta) Reset() { *x = KubernetesMeta{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[11] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1273,7 +1336,7 @@ func (x *KubernetesMeta) String() string { func (*KubernetesMeta) ProtoMessage() {} func (x *KubernetesMeta) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[11] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1286,7 +1349,7 @@ func (x *KubernetesMeta) ProtoReflect() protoreflect.Message { // Deprecated: Use KubernetesMeta.ProtoReflect.Descriptor instead. func (*KubernetesMeta) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{11} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{12} } func (x *KubernetesMeta) GetNamespace() string { @@ -1315,7 +1378,7 @@ type StreamSpec struct { func (x *StreamSpec) Reset() { *x = StreamSpec{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[12] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1328,7 +1391,7 @@ func (x *StreamSpec) String() string { func (*StreamSpec) ProtoMessage() {} func (x *StreamSpec) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[12] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1341,7 +1404,7 @@ func (x *StreamSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use StreamSpec.ProtoReflect.Descriptor instead. func (*StreamSpec) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{12} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{13} } func (x *StreamSpec) GetInputTopic() string { @@ -1373,7 +1436,7 @@ type StorageConfig struct { func (x *StorageConfig) Reset() { *x = StorageConfig{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[13] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1386,7 +1449,7 @@ func (x *StorageConfig) String() string { func (*StorageConfig) ProtoMessage() {} func (x *StorageConfig) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[13] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1399,7 +1462,7 @@ func (x *StorageConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use StorageConfig.ProtoReflect.Descriptor instead. func (*StorageConfig) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{13} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{14} } func (m *StorageConfig) GetConfig() isStorageConfig_Config { @@ -1448,7 +1511,7 @@ type LoadModelResponse struct { func (x *LoadModelResponse) Reset() { *x = LoadModelResponse{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[14] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1461,7 +1524,7 @@ func (x *LoadModelResponse) String() string { func (*LoadModelResponse) ProtoMessage() {} func (x *LoadModelResponse) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[14] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1474,7 +1537,7 @@ func (x *LoadModelResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use LoadModelResponse.ProtoReflect.Descriptor instead. func (*LoadModelResponse) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{14} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{15} } // ModelReference represents a unique model @@ -1490,7 +1553,7 @@ type ModelReference struct { func (x *ModelReference) Reset() { *x = ModelReference{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[15] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1503,7 +1566,7 @@ func (x *ModelReference) String() string { func (*ModelReference) ProtoMessage() {} func (x *ModelReference) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[15] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1516,7 +1579,7 @@ func (x *ModelReference) ProtoReflect() protoreflect.Message { // Deprecated: Use ModelReference.ProtoReflect.Descriptor instead. func (*ModelReference) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{15} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{16} } func (x *ModelReference) GetName() string { @@ -1545,7 +1608,7 @@ type UnloadModelRequest struct { func (x *UnloadModelRequest) Reset() { *x = UnloadModelRequest{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[16] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1558,7 +1621,7 @@ func (x *UnloadModelRequest) String() string { func (*UnloadModelRequest) ProtoMessage() {} func (x *UnloadModelRequest) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[16] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1571,7 +1634,7 @@ func (x *UnloadModelRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UnloadModelRequest.ProtoReflect.Descriptor instead. func (*UnloadModelRequest) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{16} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{17} } func (x *UnloadModelRequest) GetModel() *ModelReference { @@ -1597,7 +1660,7 @@ type UnloadModelResponse struct { func (x *UnloadModelResponse) Reset() { *x = UnloadModelResponse{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[17] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1610,7 +1673,7 @@ func (x *UnloadModelResponse) String() string { func (*UnloadModelResponse) ProtoMessage() {} func (x *UnloadModelResponse) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[17] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1623,7 +1686,7 @@ func (x *UnloadModelResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UnloadModelResponse.ProtoReflect.Descriptor instead. func (*UnloadModelResponse) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{17} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{18} } // ModelStatusResponse provides the current assignment of the model onto a server @@ -1640,7 +1703,7 @@ type ModelStatusResponse struct { func (x *ModelStatusResponse) Reset() { *x = ModelStatusResponse{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[18] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1653,7 +1716,7 @@ func (x *ModelStatusResponse) String() string { func (*ModelStatusResponse) ProtoMessage() {} func (x *ModelStatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[18] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1666,7 +1729,7 @@ func (x *ModelStatusResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ModelStatusResponse.ProtoReflect.Descriptor instead. func (*ModelStatusResponse) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{18} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{19} } func (x *ModelStatusResponse) GetModelName() string { @@ -1706,7 +1769,7 @@ type ModelVersionStatus struct { func (x *ModelVersionStatus) Reset() { *x = ModelVersionStatus{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[19] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1719,7 +1782,7 @@ func (x *ModelVersionStatus) String() string { func (*ModelVersionStatus) ProtoMessage() {} func (x *ModelVersionStatus) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[19] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1732,7 +1795,7 @@ func (x *ModelVersionStatus) ProtoReflect() protoreflect.Message { // Deprecated: Use ModelVersionStatus.ProtoReflect.Descriptor instead. func (*ModelVersionStatus) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{19} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{20} } func (x *ModelVersionStatus) GetVersion() uint32 { @@ -1792,7 +1855,7 @@ type ModelStatus struct { func (x *ModelStatus) Reset() { *x = ModelStatus{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[20] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1805,7 +1868,7 @@ func (x *ModelStatus) String() string { func (*ModelStatus) ProtoMessage() {} func (x *ModelStatus) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[20] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1818,7 +1881,7 @@ func (x *ModelStatus) ProtoReflect() protoreflect.Message { // Deprecated: Use ModelStatus.ProtoReflect.Descriptor instead. func (*ModelStatus) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{20} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{21} } func (x *ModelStatus) GetState() ModelStatus_ModelState { @@ -1869,7 +1932,7 @@ type ModelReplicaStatus struct { func (x *ModelReplicaStatus) Reset() { *x = ModelReplicaStatus{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[21] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1882,7 +1945,7 @@ func (x *ModelReplicaStatus) String() string { func (*ModelReplicaStatus) ProtoMessage() {} func (x *ModelReplicaStatus) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[21] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1895,7 +1958,7 @@ func (x *ModelReplicaStatus) ProtoReflect() protoreflect.Message { // Deprecated: Use ModelReplicaStatus.ProtoReflect.Descriptor instead. func (*ModelReplicaStatus) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{21} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{22} } func (x *ModelReplicaStatus) GetState() ModelReplicaStatus_ModelReplicaState { @@ -1931,7 +1994,7 @@ type ServerStatusRequest struct { func (x *ServerStatusRequest) Reset() { *x = ServerStatusRequest{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[22] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1944,7 +2007,7 @@ func (x *ServerStatusRequest) String() string { func (*ServerStatusRequest) ProtoMessage() {} func (x *ServerStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[22] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1957,7 +2020,7 @@ func (x *ServerStatusRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ServerStatusRequest.ProtoReflect.Descriptor instead. func (*ServerStatusRequest) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{22} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{23} } func (x *ServerStatusRequest) GetSubscriberName() string { @@ -1992,7 +2055,7 @@ type ServerStatusResponse struct { func (x *ServerStatusResponse) Reset() { *x = ServerStatusResponse{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[23] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2005,7 +2068,7 @@ func (x *ServerStatusResponse) String() string { func (*ServerStatusResponse) ProtoMessage() {} func (x *ServerStatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[23] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2018,7 +2081,7 @@ func (x *ServerStatusResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ServerStatusResponse.ProtoReflect.Descriptor instead. func (*ServerStatusResponse) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{23} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{24} } func (x *ServerStatusResponse) GetType() ServerStatusResponse_Type { @@ -2085,7 +2148,7 @@ type ServerReplicaResources struct { func (x *ServerReplicaResources) Reset() { *x = ServerReplicaResources{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[24] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2098,7 +2161,7 @@ func (x *ServerReplicaResources) String() string { func (*ServerReplicaResources) ProtoMessage() {} func (x *ServerReplicaResources) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[24] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2111,7 +2174,7 @@ func (x *ServerReplicaResources) ProtoReflect() protoreflect.Message { // Deprecated: Use ServerReplicaResources.ProtoReflect.Descriptor instead. func (*ServerReplicaResources) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{24} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{25} } func (x *ServerReplicaResources) GetReplicaIdx() uint32 { @@ -2160,7 +2223,7 @@ type ModelSubscriptionRequest struct { func (x *ModelSubscriptionRequest) Reset() { *x = ModelSubscriptionRequest{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[25] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2173,7 +2236,7 @@ func (x *ModelSubscriptionRequest) String() string { func (*ModelSubscriptionRequest) ProtoMessage() {} func (x *ModelSubscriptionRequest) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[25] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2186,7 +2249,7 @@ func (x *ModelSubscriptionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ModelSubscriptionRequest.ProtoReflect.Descriptor instead. func (*ModelSubscriptionRequest) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{25} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{26} } func (x *ModelSubscriptionRequest) GetSubscriberName() string { @@ -2209,7 +2272,7 @@ type ModelStatusRequest struct { func (x *ModelStatusRequest) Reset() { *x = ModelStatusRequest{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[26] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2222,7 +2285,7 @@ func (x *ModelStatusRequest) String() string { func (*ModelStatusRequest) ProtoMessage() {} func (x *ModelStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[26] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2235,7 +2298,7 @@ func (x *ModelStatusRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ModelStatusRequest.ProtoReflect.Descriptor instead. func (*ModelStatusRequest) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{26} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{27} } func (x *ModelStatusRequest) GetSubscriberName() string { @@ -2271,7 +2334,7 @@ type ServerNotifyRequest struct { func (x *ServerNotifyRequest) Reset() { *x = ServerNotifyRequest{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[27] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2284,7 +2347,7 @@ func (x *ServerNotifyRequest) String() string { func (*ServerNotifyRequest) ProtoMessage() {} func (x *ServerNotifyRequest) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[27] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2297,7 +2360,7 @@ func (x *ServerNotifyRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ServerNotifyRequest.ProtoReflect.Descriptor instead. func (*ServerNotifyRequest) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{27} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{28} } func (x *ServerNotifyRequest) GetServers() []*ServerNotify { @@ -2330,7 +2393,7 @@ type ServerNotify struct { func (x *ServerNotify) Reset() { *x = ServerNotify{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[28] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2343,7 +2406,7 @@ func (x *ServerNotify) String() string { func (*ServerNotify) ProtoMessage() {} func (x *ServerNotify) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[28] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2356,7 +2419,7 @@ func (x *ServerNotify) ProtoReflect() protoreflect.Message { // Deprecated: Use ServerNotify.ProtoReflect.Descriptor instead. func (*ServerNotify) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{28} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{29} } func (x *ServerNotify) GetName() string { @@ -2410,7 +2473,7 @@ type ServerNotifyResponse struct { func (x *ServerNotifyResponse) Reset() { *x = ServerNotifyResponse{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[29] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2423,7 +2486,7 @@ func (x *ServerNotifyResponse) String() string { func (*ServerNotifyResponse) ProtoMessage() {} func (x *ServerNotifyResponse) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[29] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2436,7 +2499,7 @@ func (x *ServerNotifyResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ServerNotifyResponse.ProtoReflect.Descriptor instead. func (*ServerNotifyResponse) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{29} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{30} } type ServerSubscriptionRequest struct { @@ -2450,7 +2513,7 @@ type ServerSubscriptionRequest struct { func (x *ServerSubscriptionRequest) Reset() { *x = ServerSubscriptionRequest{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[30] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2463,7 +2526,7 @@ func (x *ServerSubscriptionRequest) String() string { func (*ServerSubscriptionRequest) ProtoMessage() {} func (x *ServerSubscriptionRequest) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[30] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2476,7 +2539,7 @@ func (x *ServerSubscriptionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ServerSubscriptionRequest.ProtoReflect.Descriptor instead. func (*ServerSubscriptionRequest) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{30} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{31} } func (x *ServerSubscriptionRequest) GetSubscriberName() string { @@ -2497,7 +2560,7 @@ type StartExperimentRequest struct { func (x *StartExperimentRequest) Reset() { *x = StartExperimentRequest{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[31] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2510,7 +2573,7 @@ func (x *StartExperimentRequest) String() string { func (*StartExperimentRequest) ProtoMessage() {} func (x *StartExperimentRequest) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[31] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2523,7 +2586,7 @@ func (x *StartExperimentRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use StartExperimentRequest.ProtoReflect.Descriptor instead. func (*StartExperimentRequest) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{31} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{32} } func (x *StartExperimentRequest) GetExperiment() *Experiment { @@ -2550,7 +2613,7 @@ type Experiment struct { func (x *Experiment) Reset() { *x = Experiment{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[32] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2563,7 +2626,7 @@ func (x *Experiment) String() string { func (*Experiment) ProtoMessage() {} func (x *Experiment) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[32] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2576,7 +2639,7 @@ func (x *Experiment) ProtoReflect() protoreflect.Message { // Deprecated: Use Experiment.ProtoReflect.Descriptor instead. func (*Experiment) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{32} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{33} } func (x *Experiment) GetName() string { @@ -2639,7 +2702,7 @@ type ExperimentConfig struct { func (x *ExperimentConfig) Reset() { *x = ExperimentConfig{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[33] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2652,7 +2715,7 @@ func (x *ExperimentConfig) String() string { func (*ExperimentConfig) ProtoMessage() {} func (x *ExperimentConfig) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[33] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2665,7 +2728,7 @@ func (x *ExperimentConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use ExperimentConfig.ProtoReflect.Descriptor instead. func (*ExperimentConfig) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{33} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{34} } func (x *ExperimentConfig) GetStickySessions() bool { @@ -2687,7 +2750,7 @@ type ExperimentCandidate struct { func (x *ExperimentCandidate) Reset() { *x = ExperimentCandidate{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[34] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2700,7 +2763,7 @@ func (x *ExperimentCandidate) String() string { func (*ExperimentCandidate) ProtoMessage() {} func (x *ExperimentCandidate) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[34] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2713,7 +2776,7 @@ func (x *ExperimentCandidate) ProtoReflect() protoreflect.Message { // Deprecated: Use ExperimentCandidate.ProtoReflect.Descriptor instead. func (*ExperimentCandidate) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{34} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{35} } func (x *ExperimentCandidate) GetName() string { @@ -2742,7 +2805,7 @@ type ExperimentMirror struct { func (x *ExperimentMirror) Reset() { *x = ExperimentMirror{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[35] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2755,7 +2818,7 @@ func (x *ExperimentMirror) String() string { func (*ExperimentMirror) ProtoMessage() {} func (x *ExperimentMirror) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[35] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2768,7 +2831,7 @@ func (x *ExperimentMirror) ProtoReflect() protoreflect.Message { // Deprecated: Use ExperimentMirror.ProtoReflect.Descriptor instead. func (*ExperimentMirror) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{35} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{36} } func (x *ExperimentMirror) GetName() string { @@ -2794,7 +2857,7 @@ type StartExperimentResponse struct { func (x *StartExperimentResponse) Reset() { *x = StartExperimentResponse{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[36] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2807,7 +2870,7 @@ func (x *StartExperimentResponse) String() string { func (*StartExperimentResponse) ProtoMessage() {} func (x *StartExperimentResponse) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[36] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2820,7 +2883,7 @@ func (x *StartExperimentResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use StartExperimentResponse.ProtoReflect.Descriptor instead. func (*StartExperimentResponse) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{36} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{37} } type StopExperimentRequest struct { @@ -2834,7 +2897,7 @@ type StopExperimentRequest struct { func (x *StopExperimentRequest) Reset() { *x = StopExperimentRequest{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[37] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2847,7 +2910,7 @@ func (x *StopExperimentRequest) String() string { func (*StopExperimentRequest) ProtoMessage() {} func (x *StopExperimentRequest) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[37] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2860,7 +2923,7 @@ func (x *StopExperimentRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use StopExperimentRequest.ProtoReflect.Descriptor instead. func (*StopExperimentRequest) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{37} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{38} } func (x *StopExperimentRequest) GetName() string { @@ -2879,7 +2942,7 @@ type StopExperimentResponse struct { func (x *StopExperimentResponse) Reset() { *x = StopExperimentResponse{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[38] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2892,7 +2955,7 @@ func (x *StopExperimentResponse) String() string { func (*StopExperimentResponse) ProtoMessage() {} func (x *StopExperimentResponse) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[38] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2905,7 +2968,7 @@ func (x *StopExperimentResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use StopExperimentResponse.ProtoReflect.Descriptor instead. func (*StopExperimentResponse) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{38} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{39} } type ExperimentSubscriptionRequest struct { @@ -2919,7 +2982,7 @@ type ExperimentSubscriptionRequest struct { func (x *ExperimentSubscriptionRequest) Reset() { *x = ExperimentSubscriptionRequest{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[39] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2932,7 +2995,7 @@ func (x *ExperimentSubscriptionRequest) String() string { func (*ExperimentSubscriptionRequest) ProtoMessage() {} func (x *ExperimentSubscriptionRequest) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[39] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2945,7 +3008,7 @@ func (x *ExperimentSubscriptionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ExperimentSubscriptionRequest.ProtoReflect.Descriptor instead. func (*ExperimentSubscriptionRequest) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{39} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{40} } func (x *ExperimentSubscriptionRequest) GetSubscriberName() string { @@ -2971,7 +3034,7 @@ type ExperimentStatusResponse struct { func (x *ExperimentStatusResponse) Reset() { *x = ExperimentStatusResponse{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[40] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2984,7 +3047,7 @@ func (x *ExperimentStatusResponse) String() string { func (*ExperimentStatusResponse) ProtoMessage() {} func (x *ExperimentStatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[40] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2997,7 +3060,7 @@ func (x *ExperimentStatusResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ExperimentStatusResponse.ProtoReflect.Descriptor instead. func (*ExperimentStatusResponse) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{40} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{41} } func (x *ExperimentStatusResponse) GetExperimentName() string { @@ -3053,7 +3116,7 @@ type LoadPipelineRequest struct { func (x *LoadPipelineRequest) Reset() { *x = LoadPipelineRequest{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[41] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3066,7 +3129,7 @@ func (x *LoadPipelineRequest) String() string { func (*LoadPipelineRequest) ProtoMessage() {} func (x *LoadPipelineRequest) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[41] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3079,7 +3142,7 @@ func (x *LoadPipelineRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use LoadPipelineRequest.ProtoReflect.Descriptor instead. func (*LoadPipelineRequest) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{41} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{42} } func (x *LoadPipelineRequest) GetPipeline() *Pipeline { @@ -3101,7 +3164,7 @@ type ExperimentStatusRequest struct { func (x *ExperimentStatusRequest) Reset() { *x = ExperimentStatusRequest{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[42] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3114,7 +3177,7 @@ func (x *ExperimentStatusRequest) String() string { func (*ExperimentStatusRequest) ProtoMessage() {} func (x *ExperimentStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[42] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3127,7 +3190,7 @@ func (x *ExperimentStatusRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ExperimentStatusRequest.ProtoReflect.Descriptor instead. func (*ExperimentStatusRequest) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{42} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{43} } func (x *ExperimentStatusRequest) GetSubscriberName() string { @@ -3161,7 +3224,7 @@ type Pipeline struct { func (x *Pipeline) Reset() { *x = Pipeline{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[43] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3174,7 +3237,7 @@ func (x *Pipeline) String() string { func (*Pipeline) ProtoMessage() {} func (x *Pipeline) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[43] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3187,7 +3250,7 @@ func (x *Pipeline) ProtoReflect() protoreflect.Message { // Deprecated: Use Pipeline.ProtoReflect.Descriptor instead. func (*Pipeline) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{43} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{44} } func (x *Pipeline) GetName() string { @@ -3257,7 +3320,7 @@ type PipelineStep struct { func (x *PipelineStep) Reset() { *x = PipelineStep{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[44] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3270,7 +3333,7 @@ func (x *PipelineStep) String() string { func (*PipelineStep) ProtoMessage() {} func (x *PipelineStep) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[44] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3283,7 +3346,7 @@ func (x *PipelineStep) ProtoReflect() protoreflect.Message { // Deprecated: Use PipelineStep.ProtoReflect.Descriptor instead. func (*PipelineStep) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{44} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{45} } func (x *PipelineStep) GetName() string { @@ -3354,7 +3417,7 @@ type Batch struct { func (x *Batch) Reset() { *x = Batch{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[45] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3367,7 +3430,7 @@ func (x *Batch) String() string { func (*Batch) ProtoMessage() {} func (x *Batch) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[45] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3380,7 +3443,7 @@ func (x *Batch) ProtoReflect() protoreflect.Message { // Deprecated: Use Batch.ProtoReflect.Descriptor instead. func (*Batch) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{45} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{46} } func (x *Batch) GetSize() uint32 { @@ -3413,7 +3476,7 @@ type PipelineInput struct { func (x *PipelineInput) Reset() { *x = PipelineInput{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[46] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3426,7 +3489,7 @@ func (x *PipelineInput) String() string { func (*PipelineInput) ProtoMessage() {} func (x *PipelineInput) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[46] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3439,7 +3502,7 @@ func (x *PipelineInput) ProtoReflect() protoreflect.Message { // Deprecated: Use PipelineInput.ProtoReflect.Descriptor instead. func (*PipelineInput) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{46} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{47} } func (x *PipelineInput) GetExternalInputs() []string { @@ -3498,7 +3561,7 @@ type PipelineOutput struct { func (x *PipelineOutput) Reset() { *x = PipelineOutput{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[47] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3511,7 +3574,7 @@ func (x *PipelineOutput) String() string { func (*PipelineOutput) ProtoMessage() {} func (x *PipelineOutput) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[47] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3524,7 +3587,7 @@ func (x *PipelineOutput) ProtoReflect() protoreflect.Message { // Deprecated: Use PipelineOutput.ProtoReflect.Descriptor instead. func (*PipelineOutput) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{47} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{48} } func (x *PipelineOutput) GetSteps() []string { @@ -3564,7 +3627,7 @@ type LoadPipelineResponse struct { func (x *LoadPipelineResponse) Reset() { *x = LoadPipelineResponse{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[48] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3577,7 +3640,7 @@ func (x *LoadPipelineResponse) String() string { func (*LoadPipelineResponse) ProtoMessage() {} func (x *LoadPipelineResponse) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[48] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3590,7 +3653,7 @@ func (x *LoadPipelineResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use LoadPipelineResponse.ProtoReflect.Descriptor instead. func (*LoadPipelineResponse) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{48} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{49} } type UnloadPipelineRequest struct { @@ -3604,7 +3667,7 @@ type UnloadPipelineRequest struct { func (x *UnloadPipelineRequest) Reset() { *x = UnloadPipelineRequest{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[49] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3617,7 +3680,7 @@ func (x *UnloadPipelineRequest) String() string { func (*UnloadPipelineRequest) ProtoMessage() {} func (x *UnloadPipelineRequest) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[49] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3630,7 +3693,7 @@ func (x *UnloadPipelineRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UnloadPipelineRequest.ProtoReflect.Descriptor instead. func (*UnloadPipelineRequest) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{49} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{50} } func (x *UnloadPipelineRequest) GetName() string { @@ -3649,7 +3712,7 @@ type UnloadPipelineResponse struct { func (x *UnloadPipelineResponse) Reset() { *x = UnloadPipelineResponse{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[50] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3662,7 +3725,7 @@ func (x *UnloadPipelineResponse) String() string { func (*UnloadPipelineResponse) ProtoMessage() {} func (x *UnloadPipelineResponse) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[50] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3675,7 +3738,7 @@ func (x *UnloadPipelineResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UnloadPipelineResponse.ProtoReflect.Descriptor instead. func (*UnloadPipelineResponse) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{50} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{51} } type PipelineStatusRequest struct { @@ -3691,7 +3754,7 @@ type PipelineStatusRequest struct { func (x *PipelineStatusRequest) Reset() { *x = PipelineStatusRequest{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[51] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3704,7 +3767,7 @@ func (x *PipelineStatusRequest) String() string { func (*PipelineStatusRequest) ProtoMessage() {} func (x *PipelineStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[51] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3717,7 +3780,7 @@ func (x *PipelineStatusRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PipelineStatusRequest.ProtoReflect.Descriptor instead. func (*PipelineStatusRequest) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{51} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{52} } func (x *PipelineStatusRequest) GetSubscriberName() string { @@ -3752,7 +3815,7 @@ type PipelineSubscriptionRequest struct { func (x *PipelineSubscriptionRequest) Reset() { *x = PipelineSubscriptionRequest{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[52] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3765,7 +3828,7 @@ func (x *PipelineSubscriptionRequest) String() string { func (*PipelineSubscriptionRequest) ProtoMessage() {} func (x *PipelineSubscriptionRequest) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[52] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3778,7 +3841,7 @@ func (x *PipelineSubscriptionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PipelineSubscriptionRequest.ProtoReflect.Descriptor instead. func (*PipelineSubscriptionRequest) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{52} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{53} } func (x *PipelineSubscriptionRequest) GetSubscriberName() string { @@ -3800,7 +3863,7 @@ type PipelineStatusResponse struct { func (x *PipelineStatusResponse) Reset() { *x = PipelineStatusResponse{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[53] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3813,7 +3876,7 @@ func (x *PipelineStatusResponse) String() string { func (*PipelineStatusResponse) ProtoMessage() {} func (x *PipelineStatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[53] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3826,7 +3889,7 @@ func (x *PipelineStatusResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PipelineStatusResponse.ProtoReflect.Descriptor instead. func (*PipelineStatusResponse) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{53} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{54} } func (x *PipelineStatusResponse) GetPipelineName() string { @@ -3855,7 +3918,7 @@ type PipelineWithState struct { func (x *PipelineWithState) Reset() { *x = PipelineWithState{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[54] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3868,7 +3931,7 @@ func (x *PipelineWithState) String() string { func (*PipelineWithState) ProtoMessage() {} func (x *PipelineWithState) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[54] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3881,7 +3944,7 @@ func (x *PipelineWithState) ProtoReflect() protoreflect.Message { // Deprecated: Use PipelineWithState.ProtoReflect.Descriptor instead. func (*PipelineWithState) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{54} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{55} } func (x *PipelineWithState) GetPipeline() *Pipeline { @@ -3913,7 +3976,7 @@ type PipelineVersionState struct { func (x *PipelineVersionState) Reset() { *x = PipelineVersionState{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[55] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3926,7 +3989,7 @@ func (x *PipelineVersionState) String() string { func (*PipelineVersionState) ProtoMessage() {} func (x *PipelineVersionState) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[55] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3939,7 +4002,7 @@ func (x *PipelineVersionState) ProtoReflect() protoreflect.Message { // Deprecated: Use PipelineVersionState.ProtoReflect.Descriptor instead. func (*PipelineVersionState) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{55} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{56} } func (x *PipelineVersionState) GetPipelineVersion() uint32 { @@ -3988,7 +4051,7 @@ type SchedulerStatusRequest struct { func (x *SchedulerStatusRequest) Reset() { *x = SchedulerStatusRequest{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[56] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4001,7 +4064,7 @@ func (x *SchedulerStatusRequest) String() string { func (*SchedulerStatusRequest) ProtoMessage() {} func (x *SchedulerStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[56] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4014,7 +4077,7 @@ func (x *SchedulerStatusRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SchedulerStatusRequest.ProtoReflect.Descriptor instead. func (*SchedulerStatusRequest) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{56} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{57} } func (x *SchedulerStatusRequest) GetSubscriberName() string { @@ -4035,7 +4098,7 @@ type SchedulerStatusResponse struct { func (x *SchedulerStatusResponse) Reset() { *x = SchedulerStatusResponse{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[57] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4048,7 +4111,7 @@ func (x *SchedulerStatusResponse) String() string { func (*SchedulerStatusResponse) ProtoMessage() {} func (x *SchedulerStatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[57] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4061,7 +4124,7 @@ func (x *SchedulerStatusResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SchedulerStatusResponse.ProtoReflect.Descriptor instead. func (*SchedulerStatusResponse) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{57} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{58} } func (x *SchedulerStatusResponse) GetApplicationVersion() string { @@ -4082,7 +4145,7 @@ type ControlPlaneSubscriptionRequest struct { func (x *ControlPlaneSubscriptionRequest) Reset() { *x = ControlPlaneSubscriptionRequest{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[58] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4095,7 +4158,7 @@ func (x *ControlPlaneSubscriptionRequest) String() string { func (*ControlPlaneSubscriptionRequest) ProtoMessage() {} func (x *ControlPlaneSubscriptionRequest) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[58] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4108,7 +4171,7 @@ func (x *ControlPlaneSubscriptionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ControlPlaneSubscriptionRequest.ProtoReflect.Descriptor instead. func (*ControlPlaneSubscriptionRequest) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{58} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{59} } func (x *ControlPlaneSubscriptionRequest) GetSubscriberName() string { @@ -4129,7 +4192,7 @@ type ControlPlaneResponse struct { func (x *ControlPlaneResponse) Reset() { *x = ControlPlaneResponse{} if protoimpl.UnsafeEnabled { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[59] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4142,7 +4205,7 @@ func (x *ControlPlaneResponse) String() string { func (*ControlPlaneResponse) ProtoMessage() {} func (x *ControlPlaneResponse) ProtoReflect() protoreflect.Message { - mi := &file_mlops_scheduler_scheduler_proto_msgTypes[59] + mi := &file_mlops_scheduler_scheduler_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4155,7 +4218,7 @@ func (x *ControlPlaneResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ControlPlaneResponse.ProtoReflect.Descriptor instead. func (*ControlPlaneResponse) Descriptor() ([]byte, []int) { - return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{59} + return file_mlops_scheduler_scheduler_proto_rawDescGZIP(), []int{60} } func (x *ControlPlaneResponse) GetEvent() ControlPlaneResponse_Event { @@ -4218,7 +4281,7 @@ var file_mlops_scheduler_scheduler_proto_rawDesc = []byte{ 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x6c, 0x6f, 0x67, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x6c, 0x6f, 0x67, 0x50, 0x61, 0x79, 0x6c, 0x6f, - 0x61, 0x64, 0x73, 0x22, 0xd6, 0x04, 0x0a, 0x09, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x53, 0x70, 0x65, + 0x61, 0x64, 0x73, 0x22, 0x96, 0x05, 0x0a, 0x09, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x53, 0x70, 0x65, 0x63, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x69, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x69, 0x12, 0x2d, 0x0a, 0x0f, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x00, 0x52, 0x0f, @@ -4239,22 +4302,26 @@ var file_mlops_scheduler_scheduler_proto_rawDesc = []byte{ 0x25, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x48, 0x04, 0x52, 0x09, 0x65, 0x78, 0x70, 0x6c, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x45, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, - 0x74, 0x65, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x73, 0x65, 0x6c, - 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, - 0x6c, 0x65, 0x72, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x53, 0x70, 0x65, - 0x63, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x59, 0x0a, - 0x10, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x49, 0x6e, 0x66, - 0x6f, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, - 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, - 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x49, 0x6e, 0x66, - 0x6f, 0x48, 0x05, 0x52, 0x10, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x88, 0x01, 0x01, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x61, 0x72, 0x74, - 0x69, 0x66, 0x61, 0x63, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x10, 0x0a, 0x0e, - 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x0e, - 0x0a, 0x0c, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x42, 0x79, 0x74, 0x65, 0x73, 0x42, 0x09, - 0x0a, 0x07, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x65, 0x78, - 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x6d, 0x6f, 0x64, 0x65, + 0x6e, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x03, 0x6c, 0x6c, 0x6d, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, + 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x4c, 0x6c, 0x6d, + 0x53, 0x70, 0x65, 0x63, 0x48, 0x05, 0x52, 0x03, 0x6c, 0x6c, 0x6d, 0x88, 0x01, 0x01, 0x12, 0x45, + 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, + 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x50, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x59, 0x0a, 0x10, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x28, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x48, 0x06, 0x52, 0x10, 0x6d, 0x6f, 0x64, + 0x65, 0x6c, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x88, 0x01, 0x01, + 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x42, 0x79, 0x74, 0x65, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x65, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x42, + 0x06, 0x0a, 0x04, 0x5f, 0x6c, 0x6c, 0x6d, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x39, 0x0a, 0x0d, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, @@ -4268,6 +4335,13 @@ var file_mlops_scheduler_scheduler_proto_rawDesc = []byte{ 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0b, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x66, 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x66, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x52, + 0x65, 0x66, 0x22, 0x6e, 0x0a, 0x07, 0x4c, 0x6c, 0x6d, 0x53, 0x70, 0x65, 0x63, 0x12, 0x1f, 0x0a, + 0x08, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x00, 0x52, 0x08, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x66, 0x88, 0x01, 0x01, 0x12, 0x25, + 0x0a, 0x0b, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x66, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0b, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x52, + 0x65, 0x66, 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x52, + 0x65, 0x66, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x66, 0x22, 0xb8, 0x01, 0x0a, 0x10, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x4b, 0x0a, 0x08, 0x6d, 0x6c, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x73, 0x65, 0x6c, 0x64, @@ -4982,7 +5056,7 @@ func file_mlops_scheduler_scheduler_proto_rawDescGZIP() []byte { } var file_mlops_scheduler_scheduler_proto_enumTypes = make([]protoimpl.EnumInfo, 9) -var file_mlops_scheduler_scheduler_proto_msgTypes = make([]protoimpl.MessageInfo, 64) +var file_mlops_scheduler_scheduler_proto_msgTypes = make([]protoimpl.MessageInfo, 65) var file_mlops_scheduler_scheduler_proto_goTypes = []any{ (ResourceType)(0), // 0: seldon.mlops.scheduler.ResourceType (ModelStatus_ModelState)(0), // 1: seldon.mlops.scheduler.ModelStatus.ModelState @@ -5000,163 +5074,165 @@ var file_mlops_scheduler_scheduler_proto_goTypes = []any{ (*ModelSpec)(nil), // 13: seldon.mlops.scheduler.ModelSpec (*ParameterSpec)(nil), // 14: seldon.mlops.scheduler.ParameterSpec (*ExplainerSpec)(nil), // 15: seldon.mlops.scheduler.ExplainerSpec - (*ModelRuntimeInfo)(nil), // 16: seldon.mlops.scheduler.ModelRuntimeInfo - (*MLServerModelSettings)(nil), // 17: seldon.mlops.scheduler.MLServerModelSettings - (*TritonModelConfig)(nil), // 18: seldon.mlops.scheduler.TritonModelConfig - (*TritonCPU)(nil), // 19: seldon.mlops.scheduler.TritonCPU - (*KubernetesMeta)(nil), // 20: seldon.mlops.scheduler.KubernetesMeta - (*StreamSpec)(nil), // 21: seldon.mlops.scheduler.StreamSpec - (*StorageConfig)(nil), // 22: seldon.mlops.scheduler.StorageConfig - (*LoadModelResponse)(nil), // 23: seldon.mlops.scheduler.LoadModelResponse - (*ModelReference)(nil), // 24: seldon.mlops.scheduler.ModelReference - (*UnloadModelRequest)(nil), // 25: seldon.mlops.scheduler.UnloadModelRequest - (*UnloadModelResponse)(nil), // 26: seldon.mlops.scheduler.UnloadModelResponse - (*ModelStatusResponse)(nil), // 27: seldon.mlops.scheduler.ModelStatusResponse - (*ModelVersionStatus)(nil), // 28: seldon.mlops.scheduler.ModelVersionStatus - (*ModelStatus)(nil), // 29: seldon.mlops.scheduler.ModelStatus - (*ModelReplicaStatus)(nil), // 30: seldon.mlops.scheduler.ModelReplicaStatus - (*ServerStatusRequest)(nil), // 31: seldon.mlops.scheduler.ServerStatusRequest - (*ServerStatusResponse)(nil), // 32: seldon.mlops.scheduler.ServerStatusResponse - (*ServerReplicaResources)(nil), // 33: seldon.mlops.scheduler.ServerReplicaResources - (*ModelSubscriptionRequest)(nil), // 34: seldon.mlops.scheduler.ModelSubscriptionRequest - (*ModelStatusRequest)(nil), // 35: seldon.mlops.scheduler.ModelStatusRequest - (*ServerNotifyRequest)(nil), // 36: seldon.mlops.scheduler.ServerNotifyRequest - (*ServerNotify)(nil), // 37: seldon.mlops.scheduler.ServerNotify - (*ServerNotifyResponse)(nil), // 38: seldon.mlops.scheduler.ServerNotifyResponse - (*ServerSubscriptionRequest)(nil), // 39: seldon.mlops.scheduler.ServerSubscriptionRequest - (*StartExperimentRequest)(nil), // 40: seldon.mlops.scheduler.StartExperimentRequest - (*Experiment)(nil), // 41: seldon.mlops.scheduler.Experiment - (*ExperimentConfig)(nil), // 42: seldon.mlops.scheduler.ExperimentConfig - (*ExperimentCandidate)(nil), // 43: seldon.mlops.scheduler.ExperimentCandidate - (*ExperimentMirror)(nil), // 44: seldon.mlops.scheduler.ExperimentMirror - (*StartExperimentResponse)(nil), // 45: seldon.mlops.scheduler.StartExperimentResponse - (*StopExperimentRequest)(nil), // 46: seldon.mlops.scheduler.StopExperimentRequest - (*StopExperimentResponse)(nil), // 47: seldon.mlops.scheduler.StopExperimentResponse - (*ExperimentSubscriptionRequest)(nil), // 48: seldon.mlops.scheduler.ExperimentSubscriptionRequest - (*ExperimentStatusResponse)(nil), // 49: seldon.mlops.scheduler.ExperimentStatusResponse - (*LoadPipelineRequest)(nil), // 50: seldon.mlops.scheduler.LoadPipelineRequest - (*ExperimentStatusRequest)(nil), // 51: seldon.mlops.scheduler.ExperimentStatusRequest - (*Pipeline)(nil), // 52: seldon.mlops.scheduler.Pipeline - (*PipelineStep)(nil), // 53: seldon.mlops.scheduler.PipelineStep - (*Batch)(nil), // 54: seldon.mlops.scheduler.Batch - (*PipelineInput)(nil), // 55: seldon.mlops.scheduler.PipelineInput - (*PipelineOutput)(nil), // 56: seldon.mlops.scheduler.PipelineOutput - (*LoadPipelineResponse)(nil), // 57: seldon.mlops.scheduler.LoadPipelineResponse - (*UnloadPipelineRequest)(nil), // 58: seldon.mlops.scheduler.UnloadPipelineRequest - (*UnloadPipelineResponse)(nil), // 59: seldon.mlops.scheduler.UnloadPipelineResponse - (*PipelineStatusRequest)(nil), // 60: seldon.mlops.scheduler.PipelineStatusRequest - (*PipelineSubscriptionRequest)(nil), // 61: seldon.mlops.scheduler.PipelineSubscriptionRequest - (*PipelineStatusResponse)(nil), // 62: seldon.mlops.scheduler.PipelineStatusResponse - (*PipelineWithState)(nil), // 63: seldon.mlops.scheduler.PipelineWithState - (*PipelineVersionState)(nil), // 64: seldon.mlops.scheduler.PipelineVersionState - (*SchedulerStatusRequest)(nil), // 65: seldon.mlops.scheduler.SchedulerStatusRequest - (*SchedulerStatusResponse)(nil), // 66: seldon.mlops.scheduler.SchedulerStatusResponse - (*ControlPlaneSubscriptionRequest)(nil), // 67: seldon.mlops.scheduler.ControlPlaneSubscriptionRequest - (*ControlPlaneResponse)(nil), // 68: seldon.mlops.scheduler.ControlPlaneResponse - nil, // 69: seldon.mlops.scheduler.ModelVersionStatus.ModelReplicaStateEntry - nil, // 70: seldon.mlops.scheduler.PipelineStep.TensorMapEntry - nil, // 71: seldon.mlops.scheduler.PipelineInput.TensorMapEntry - nil, // 72: seldon.mlops.scheduler.PipelineOutput.TensorMapEntry - (*timestamppb.Timestamp)(nil), // 73: google.protobuf.Timestamp + (*LlmSpec)(nil), // 16: seldon.mlops.scheduler.LlmSpec + (*ModelRuntimeInfo)(nil), // 17: seldon.mlops.scheduler.ModelRuntimeInfo + (*MLServerModelSettings)(nil), // 18: seldon.mlops.scheduler.MLServerModelSettings + (*TritonModelConfig)(nil), // 19: seldon.mlops.scheduler.TritonModelConfig + (*TritonCPU)(nil), // 20: seldon.mlops.scheduler.TritonCPU + (*KubernetesMeta)(nil), // 21: seldon.mlops.scheduler.KubernetesMeta + (*StreamSpec)(nil), // 22: seldon.mlops.scheduler.StreamSpec + (*StorageConfig)(nil), // 23: seldon.mlops.scheduler.StorageConfig + (*LoadModelResponse)(nil), // 24: seldon.mlops.scheduler.LoadModelResponse + (*ModelReference)(nil), // 25: seldon.mlops.scheduler.ModelReference + (*UnloadModelRequest)(nil), // 26: seldon.mlops.scheduler.UnloadModelRequest + (*UnloadModelResponse)(nil), // 27: seldon.mlops.scheduler.UnloadModelResponse + (*ModelStatusResponse)(nil), // 28: seldon.mlops.scheduler.ModelStatusResponse + (*ModelVersionStatus)(nil), // 29: seldon.mlops.scheduler.ModelVersionStatus + (*ModelStatus)(nil), // 30: seldon.mlops.scheduler.ModelStatus + (*ModelReplicaStatus)(nil), // 31: seldon.mlops.scheduler.ModelReplicaStatus + (*ServerStatusRequest)(nil), // 32: seldon.mlops.scheduler.ServerStatusRequest + (*ServerStatusResponse)(nil), // 33: seldon.mlops.scheduler.ServerStatusResponse + (*ServerReplicaResources)(nil), // 34: seldon.mlops.scheduler.ServerReplicaResources + (*ModelSubscriptionRequest)(nil), // 35: seldon.mlops.scheduler.ModelSubscriptionRequest + (*ModelStatusRequest)(nil), // 36: seldon.mlops.scheduler.ModelStatusRequest + (*ServerNotifyRequest)(nil), // 37: seldon.mlops.scheduler.ServerNotifyRequest + (*ServerNotify)(nil), // 38: seldon.mlops.scheduler.ServerNotify + (*ServerNotifyResponse)(nil), // 39: seldon.mlops.scheduler.ServerNotifyResponse + (*ServerSubscriptionRequest)(nil), // 40: seldon.mlops.scheduler.ServerSubscriptionRequest + (*StartExperimentRequest)(nil), // 41: seldon.mlops.scheduler.StartExperimentRequest + (*Experiment)(nil), // 42: seldon.mlops.scheduler.Experiment + (*ExperimentConfig)(nil), // 43: seldon.mlops.scheduler.ExperimentConfig + (*ExperimentCandidate)(nil), // 44: seldon.mlops.scheduler.ExperimentCandidate + (*ExperimentMirror)(nil), // 45: seldon.mlops.scheduler.ExperimentMirror + (*StartExperimentResponse)(nil), // 46: seldon.mlops.scheduler.StartExperimentResponse + (*StopExperimentRequest)(nil), // 47: seldon.mlops.scheduler.StopExperimentRequest + (*StopExperimentResponse)(nil), // 48: seldon.mlops.scheduler.StopExperimentResponse + (*ExperimentSubscriptionRequest)(nil), // 49: seldon.mlops.scheduler.ExperimentSubscriptionRequest + (*ExperimentStatusResponse)(nil), // 50: seldon.mlops.scheduler.ExperimentStatusResponse + (*LoadPipelineRequest)(nil), // 51: seldon.mlops.scheduler.LoadPipelineRequest + (*ExperimentStatusRequest)(nil), // 52: seldon.mlops.scheduler.ExperimentStatusRequest + (*Pipeline)(nil), // 53: seldon.mlops.scheduler.Pipeline + (*PipelineStep)(nil), // 54: seldon.mlops.scheduler.PipelineStep + (*Batch)(nil), // 55: seldon.mlops.scheduler.Batch + (*PipelineInput)(nil), // 56: seldon.mlops.scheduler.PipelineInput + (*PipelineOutput)(nil), // 57: seldon.mlops.scheduler.PipelineOutput + (*LoadPipelineResponse)(nil), // 58: seldon.mlops.scheduler.LoadPipelineResponse + (*UnloadPipelineRequest)(nil), // 59: seldon.mlops.scheduler.UnloadPipelineRequest + (*UnloadPipelineResponse)(nil), // 60: seldon.mlops.scheduler.UnloadPipelineResponse + (*PipelineStatusRequest)(nil), // 61: seldon.mlops.scheduler.PipelineStatusRequest + (*PipelineSubscriptionRequest)(nil), // 62: seldon.mlops.scheduler.PipelineSubscriptionRequest + (*PipelineStatusResponse)(nil), // 63: seldon.mlops.scheduler.PipelineStatusResponse + (*PipelineWithState)(nil), // 64: seldon.mlops.scheduler.PipelineWithState + (*PipelineVersionState)(nil), // 65: seldon.mlops.scheduler.PipelineVersionState + (*SchedulerStatusRequest)(nil), // 66: seldon.mlops.scheduler.SchedulerStatusRequest + (*SchedulerStatusResponse)(nil), // 67: seldon.mlops.scheduler.SchedulerStatusResponse + (*ControlPlaneSubscriptionRequest)(nil), // 68: seldon.mlops.scheduler.ControlPlaneSubscriptionRequest + (*ControlPlaneResponse)(nil), // 69: seldon.mlops.scheduler.ControlPlaneResponse + nil, // 70: seldon.mlops.scheduler.ModelVersionStatus.ModelReplicaStateEntry + nil, // 71: seldon.mlops.scheduler.PipelineStep.TensorMapEntry + nil, // 72: seldon.mlops.scheduler.PipelineInput.TensorMapEntry + nil, // 73: seldon.mlops.scheduler.PipelineOutput.TensorMapEntry + (*timestamppb.Timestamp)(nil), // 74: google.protobuf.Timestamp } var file_mlops_scheduler_scheduler_proto_depIdxs = []int32{ 10, // 0: seldon.mlops.scheduler.LoadModelRequest.model:type_name -> seldon.mlops.scheduler.Model 11, // 1: seldon.mlops.scheduler.Model.meta:type_name -> seldon.mlops.scheduler.MetaData 13, // 2: seldon.mlops.scheduler.Model.modelSpec:type_name -> seldon.mlops.scheduler.ModelSpec 12, // 3: seldon.mlops.scheduler.Model.deploymentSpec:type_name -> seldon.mlops.scheduler.DeploymentSpec - 21, // 4: seldon.mlops.scheduler.Model.streamSpec:type_name -> seldon.mlops.scheduler.StreamSpec - 20, // 5: seldon.mlops.scheduler.MetaData.kubernetesMeta:type_name -> seldon.mlops.scheduler.KubernetesMeta - 22, // 6: seldon.mlops.scheduler.ModelSpec.storageConfig:type_name -> seldon.mlops.scheduler.StorageConfig + 22, // 4: seldon.mlops.scheduler.Model.streamSpec:type_name -> seldon.mlops.scheduler.StreamSpec + 21, // 5: seldon.mlops.scheduler.MetaData.kubernetesMeta:type_name -> seldon.mlops.scheduler.KubernetesMeta + 23, // 6: seldon.mlops.scheduler.ModelSpec.storageConfig:type_name -> seldon.mlops.scheduler.StorageConfig 15, // 7: seldon.mlops.scheduler.ModelSpec.explainer:type_name -> seldon.mlops.scheduler.ExplainerSpec - 14, // 8: seldon.mlops.scheduler.ModelSpec.parameters:type_name -> seldon.mlops.scheduler.ParameterSpec - 16, // 9: seldon.mlops.scheduler.ModelSpec.modelRuntimeInfo:type_name -> seldon.mlops.scheduler.ModelRuntimeInfo - 17, // 10: seldon.mlops.scheduler.ModelRuntimeInfo.mlserver:type_name -> seldon.mlops.scheduler.MLServerModelSettings - 18, // 11: seldon.mlops.scheduler.ModelRuntimeInfo.triton:type_name -> seldon.mlops.scheduler.TritonModelConfig - 19, // 12: seldon.mlops.scheduler.TritonModelConfig.cpu:type_name -> seldon.mlops.scheduler.TritonCPU - 24, // 13: seldon.mlops.scheduler.UnloadModelRequest.model:type_name -> seldon.mlops.scheduler.ModelReference - 20, // 14: seldon.mlops.scheduler.UnloadModelRequest.kubernetesMeta:type_name -> seldon.mlops.scheduler.KubernetesMeta - 28, // 15: seldon.mlops.scheduler.ModelStatusResponse.versions:type_name -> seldon.mlops.scheduler.ModelVersionStatus - 20, // 16: seldon.mlops.scheduler.ModelVersionStatus.kubernetesMeta:type_name -> seldon.mlops.scheduler.KubernetesMeta - 69, // 17: seldon.mlops.scheduler.ModelVersionStatus.modelReplicaState:type_name -> seldon.mlops.scheduler.ModelVersionStatus.ModelReplicaStateEntry - 29, // 18: seldon.mlops.scheduler.ModelVersionStatus.state:type_name -> seldon.mlops.scheduler.ModelStatus - 10, // 19: seldon.mlops.scheduler.ModelVersionStatus.modelDefn:type_name -> seldon.mlops.scheduler.Model - 1, // 20: seldon.mlops.scheduler.ModelStatus.state:type_name -> seldon.mlops.scheduler.ModelStatus.ModelState - 73, // 21: seldon.mlops.scheduler.ModelStatus.lastChangeTimestamp:type_name -> google.protobuf.Timestamp - 2, // 22: seldon.mlops.scheduler.ModelReplicaStatus.state:type_name -> seldon.mlops.scheduler.ModelReplicaStatus.ModelReplicaState - 73, // 23: seldon.mlops.scheduler.ModelReplicaStatus.lastChangeTimestamp:type_name -> google.protobuf.Timestamp - 3, // 24: seldon.mlops.scheduler.ServerStatusResponse.type:type_name -> seldon.mlops.scheduler.ServerStatusResponse.Type - 33, // 25: seldon.mlops.scheduler.ServerStatusResponse.resources:type_name -> seldon.mlops.scheduler.ServerReplicaResources - 20, // 26: seldon.mlops.scheduler.ServerStatusResponse.kubernetesMeta:type_name -> seldon.mlops.scheduler.KubernetesMeta - 24, // 27: seldon.mlops.scheduler.ModelStatusRequest.model:type_name -> seldon.mlops.scheduler.ModelReference - 37, // 28: seldon.mlops.scheduler.ServerNotifyRequest.servers:type_name -> seldon.mlops.scheduler.ServerNotify - 20, // 29: seldon.mlops.scheduler.ServerNotify.kubernetesMeta:type_name -> seldon.mlops.scheduler.KubernetesMeta - 41, // 30: seldon.mlops.scheduler.StartExperimentRequest.experiment:type_name -> seldon.mlops.scheduler.Experiment - 43, // 31: seldon.mlops.scheduler.Experiment.candidates:type_name -> seldon.mlops.scheduler.ExperimentCandidate - 44, // 32: seldon.mlops.scheduler.Experiment.mirror:type_name -> seldon.mlops.scheduler.ExperimentMirror - 42, // 33: seldon.mlops.scheduler.Experiment.config:type_name -> seldon.mlops.scheduler.ExperimentConfig - 20, // 34: seldon.mlops.scheduler.Experiment.kubernetesMeta:type_name -> seldon.mlops.scheduler.KubernetesMeta - 0, // 35: seldon.mlops.scheduler.Experiment.resourceType:type_name -> seldon.mlops.scheduler.ResourceType - 20, // 36: seldon.mlops.scheduler.ExperimentStatusResponse.kubernetesMeta:type_name -> seldon.mlops.scheduler.KubernetesMeta - 52, // 37: seldon.mlops.scheduler.LoadPipelineRequest.pipeline:type_name -> seldon.mlops.scheduler.Pipeline - 53, // 38: seldon.mlops.scheduler.Pipeline.steps:type_name -> seldon.mlops.scheduler.PipelineStep - 56, // 39: seldon.mlops.scheduler.Pipeline.output:type_name -> seldon.mlops.scheduler.PipelineOutput - 20, // 40: seldon.mlops.scheduler.Pipeline.kubernetesMeta:type_name -> seldon.mlops.scheduler.KubernetesMeta - 55, // 41: seldon.mlops.scheduler.Pipeline.input:type_name -> seldon.mlops.scheduler.PipelineInput - 70, // 42: seldon.mlops.scheduler.PipelineStep.tensorMap:type_name -> seldon.mlops.scheduler.PipelineStep.TensorMapEntry - 4, // 43: seldon.mlops.scheduler.PipelineStep.inputsJoin:type_name -> seldon.mlops.scheduler.PipelineStep.JoinOp - 4, // 44: seldon.mlops.scheduler.PipelineStep.triggersJoin:type_name -> seldon.mlops.scheduler.PipelineStep.JoinOp - 54, // 45: seldon.mlops.scheduler.PipelineStep.batch:type_name -> seldon.mlops.scheduler.Batch - 5, // 46: seldon.mlops.scheduler.PipelineInput.joinType:type_name -> seldon.mlops.scheduler.PipelineInput.JoinOp - 5, // 47: seldon.mlops.scheduler.PipelineInput.triggersJoin:type_name -> seldon.mlops.scheduler.PipelineInput.JoinOp - 71, // 48: seldon.mlops.scheduler.PipelineInput.tensorMap:type_name -> seldon.mlops.scheduler.PipelineInput.TensorMapEntry - 6, // 49: seldon.mlops.scheduler.PipelineOutput.stepsJoin:type_name -> seldon.mlops.scheduler.PipelineOutput.JoinOp - 72, // 50: seldon.mlops.scheduler.PipelineOutput.tensorMap:type_name -> seldon.mlops.scheduler.PipelineOutput.TensorMapEntry - 63, // 51: seldon.mlops.scheduler.PipelineStatusResponse.versions:type_name -> seldon.mlops.scheduler.PipelineWithState - 52, // 52: seldon.mlops.scheduler.PipelineWithState.pipeline:type_name -> seldon.mlops.scheduler.Pipeline - 64, // 53: seldon.mlops.scheduler.PipelineWithState.state:type_name -> seldon.mlops.scheduler.PipelineVersionState - 7, // 54: seldon.mlops.scheduler.PipelineVersionState.status:type_name -> seldon.mlops.scheduler.PipelineVersionState.PipelineStatus - 73, // 55: seldon.mlops.scheduler.PipelineVersionState.lastChangeTimestamp:type_name -> google.protobuf.Timestamp - 8, // 56: seldon.mlops.scheduler.ControlPlaneResponse.event:type_name -> seldon.mlops.scheduler.ControlPlaneResponse.Event - 30, // 57: seldon.mlops.scheduler.ModelVersionStatus.ModelReplicaStateEntry.value:type_name -> seldon.mlops.scheduler.ModelReplicaStatus - 36, // 58: seldon.mlops.scheduler.Scheduler.ServerNotify:input_type -> seldon.mlops.scheduler.ServerNotifyRequest - 9, // 59: seldon.mlops.scheduler.Scheduler.LoadModel:input_type -> seldon.mlops.scheduler.LoadModelRequest - 25, // 60: seldon.mlops.scheduler.Scheduler.UnloadModel:input_type -> seldon.mlops.scheduler.UnloadModelRequest - 50, // 61: seldon.mlops.scheduler.Scheduler.LoadPipeline:input_type -> seldon.mlops.scheduler.LoadPipelineRequest - 58, // 62: seldon.mlops.scheduler.Scheduler.UnloadPipeline:input_type -> seldon.mlops.scheduler.UnloadPipelineRequest - 40, // 63: seldon.mlops.scheduler.Scheduler.StartExperiment:input_type -> seldon.mlops.scheduler.StartExperimentRequest - 46, // 64: seldon.mlops.scheduler.Scheduler.StopExperiment:input_type -> seldon.mlops.scheduler.StopExperimentRequest - 31, // 65: seldon.mlops.scheduler.Scheduler.ServerStatus:input_type -> seldon.mlops.scheduler.ServerStatusRequest - 35, // 66: seldon.mlops.scheduler.Scheduler.ModelStatus:input_type -> seldon.mlops.scheduler.ModelStatusRequest - 60, // 67: seldon.mlops.scheduler.Scheduler.PipelineStatus:input_type -> seldon.mlops.scheduler.PipelineStatusRequest - 51, // 68: seldon.mlops.scheduler.Scheduler.ExperimentStatus:input_type -> seldon.mlops.scheduler.ExperimentStatusRequest - 65, // 69: seldon.mlops.scheduler.Scheduler.SchedulerStatus:input_type -> seldon.mlops.scheduler.SchedulerStatusRequest - 39, // 70: seldon.mlops.scheduler.Scheduler.SubscribeServerStatus:input_type -> seldon.mlops.scheduler.ServerSubscriptionRequest - 34, // 71: seldon.mlops.scheduler.Scheduler.SubscribeModelStatus:input_type -> seldon.mlops.scheduler.ModelSubscriptionRequest - 48, // 72: seldon.mlops.scheduler.Scheduler.SubscribeExperimentStatus:input_type -> seldon.mlops.scheduler.ExperimentSubscriptionRequest - 61, // 73: seldon.mlops.scheduler.Scheduler.SubscribePipelineStatus:input_type -> seldon.mlops.scheduler.PipelineSubscriptionRequest - 67, // 74: seldon.mlops.scheduler.Scheduler.SubscribeControlPlane:input_type -> seldon.mlops.scheduler.ControlPlaneSubscriptionRequest - 38, // 75: seldon.mlops.scheduler.Scheduler.ServerNotify:output_type -> seldon.mlops.scheduler.ServerNotifyResponse - 23, // 76: seldon.mlops.scheduler.Scheduler.LoadModel:output_type -> seldon.mlops.scheduler.LoadModelResponse - 26, // 77: seldon.mlops.scheduler.Scheduler.UnloadModel:output_type -> seldon.mlops.scheduler.UnloadModelResponse - 57, // 78: seldon.mlops.scheduler.Scheduler.LoadPipeline:output_type -> seldon.mlops.scheduler.LoadPipelineResponse - 59, // 79: seldon.mlops.scheduler.Scheduler.UnloadPipeline:output_type -> seldon.mlops.scheduler.UnloadPipelineResponse - 45, // 80: seldon.mlops.scheduler.Scheduler.StartExperiment:output_type -> seldon.mlops.scheduler.StartExperimentResponse - 47, // 81: seldon.mlops.scheduler.Scheduler.StopExperiment:output_type -> seldon.mlops.scheduler.StopExperimentResponse - 32, // 82: seldon.mlops.scheduler.Scheduler.ServerStatus:output_type -> seldon.mlops.scheduler.ServerStatusResponse - 27, // 83: seldon.mlops.scheduler.Scheduler.ModelStatus:output_type -> seldon.mlops.scheduler.ModelStatusResponse - 62, // 84: seldon.mlops.scheduler.Scheduler.PipelineStatus:output_type -> seldon.mlops.scheduler.PipelineStatusResponse - 49, // 85: seldon.mlops.scheduler.Scheduler.ExperimentStatus:output_type -> seldon.mlops.scheduler.ExperimentStatusResponse - 66, // 86: seldon.mlops.scheduler.Scheduler.SchedulerStatus:output_type -> seldon.mlops.scheduler.SchedulerStatusResponse - 32, // 87: seldon.mlops.scheduler.Scheduler.SubscribeServerStatus:output_type -> seldon.mlops.scheduler.ServerStatusResponse - 27, // 88: seldon.mlops.scheduler.Scheduler.SubscribeModelStatus:output_type -> seldon.mlops.scheduler.ModelStatusResponse - 49, // 89: seldon.mlops.scheduler.Scheduler.SubscribeExperimentStatus:output_type -> seldon.mlops.scheduler.ExperimentStatusResponse - 62, // 90: seldon.mlops.scheduler.Scheduler.SubscribePipelineStatus:output_type -> seldon.mlops.scheduler.PipelineStatusResponse - 68, // 91: seldon.mlops.scheduler.Scheduler.SubscribeControlPlane:output_type -> seldon.mlops.scheduler.ControlPlaneResponse - 75, // [75:92] is the sub-list for method output_type - 58, // [58:75] is the sub-list for method input_type - 58, // [58:58] is the sub-list for extension type_name - 58, // [58:58] is the sub-list for extension extendee - 0, // [0:58] is the sub-list for field type_name + 16, // 8: seldon.mlops.scheduler.ModelSpec.llm:type_name -> seldon.mlops.scheduler.LlmSpec + 14, // 9: seldon.mlops.scheduler.ModelSpec.parameters:type_name -> seldon.mlops.scheduler.ParameterSpec + 17, // 10: seldon.mlops.scheduler.ModelSpec.modelRuntimeInfo:type_name -> seldon.mlops.scheduler.ModelRuntimeInfo + 18, // 11: seldon.mlops.scheduler.ModelRuntimeInfo.mlserver:type_name -> seldon.mlops.scheduler.MLServerModelSettings + 19, // 12: seldon.mlops.scheduler.ModelRuntimeInfo.triton:type_name -> seldon.mlops.scheduler.TritonModelConfig + 20, // 13: seldon.mlops.scheduler.TritonModelConfig.cpu:type_name -> seldon.mlops.scheduler.TritonCPU + 25, // 14: seldon.mlops.scheduler.UnloadModelRequest.model:type_name -> seldon.mlops.scheduler.ModelReference + 21, // 15: seldon.mlops.scheduler.UnloadModelRequest.kubernetesMeta:type_name -> seldon.mlops.scheduler.KubernetesMeta + 29, // 16: seldon.mlops.scheduler.ModelStatusResponse.versions:type_name -> seldon.mlops.scheduler.ModelVersionStatus + 21, // 17: seldon.mlops.scheduler.ModelVersionStatus.kubernetesMeta:type_name -> seldon.mlops.scheduler.KubernetesMeta + 70, // 18: seldon.mlops.scheduler.ModelVersionStatus.modelReplicaState:type_name -> seldon.mlops.scheduler.ModelVersionStatus.ModelReplicaStateEntry + 30, // 19: seldon.mlops.scheduler.ModelVersionStatus.state:type_name -> seldon.mlops.scheduler.ModelStatus + 10, // 20: seldon.mlops.scheduler.ModelVersionStatus.modelDefn:type_name -> seldon.mlops.scheduler.Model + 1, // 21: seldon.mlops.scheduler.ModelStatus.state:type_name -> seldon.mlops.scheduler.ModelStatus.ModelState + 74, // 22: seldon.mlops.scheduler.ModelStatus.lastChangeTimestamp:type_name -> google.protobuf.Timestamp + 2, // 23: seldon.mlops.scheduler.ModelReplicaStatus.state:type_name -> seldon.mlops.scheduler.ModelReplicaStatus.ModelReplicaState + 74, // 24: seldon.mlops.scheduler.ModelReplicaStatus.lastChangeTimestamp:type_name -> google.protobuf.Timestamp + 3, // 25: seldon.mlops.scheduler.ServerStatusResponse.type:type_name -> seldon.mlops.scheduler.ServerStatusResponse.Type + 34, // 26: seldon.mlops.scheduler.ServerStatusResponse.resources:type_name -> seldon.mlops.scheduler.ServerReplicaResources + 21, // 27: seldon.mlops.scheduler.ServerStatusResponse.kubernetesMeta:type_name -> seldon.mlops.scheduler.KubernetesMeta + 25, // 28: seldon.mlops.scheduler.ModelStatusRequest.model:type_name -> seldon.mlops.scheduler.ModelReference + 38, // 29: seldon.mlops.scheduler.ServerNotifyRequest.servers:type_name -> seldon.mlops.scheduler.ServerNotify + 21, // 30: seldon.mlops.scheduler.ServerNotify.kubernetesMeta:type_name -> seldon.mlops.scheduler.KubernetesMeta + 42, // 31: seldon.mlops.scheduler.StartExperimentRequest.experiment:type_name -> seldon.mlops.scheduler.Experiment + 44, // 32: seldon.mlops.scheduler.Experiment.candidates:type_name -> seldon.mlops.scheduler.ExperimentCandidate + 45, // 33: seldon.mlops.scheduler.Experiment.mirror:type_name -> seldon.mlops.scheduler.ExperimentMirror + 43, // 34: seldon.mlops.scheduler.Experiment.config:type_name -> seldon.mlops.scheduler.ExperimentConfig + 21, // 35: seldon.mlops.scheduler.Experiment.kubernetesMeta:type_name -> seldon.mlops.scheduler.KubernetesMeta + 0, // 36: seldon.mlops.scheduler.Experiment.resourceType:type_name -> seldon.mlops.scheduler.ResourceType + 21, // 37: seldon.mlops.scheduler.ExperimentStatusResponse.kubernetesMeta:type_name -> seldon.mlops.scheduler.KubernetesMeta + 53, // 38: seldon.mlops.scheduler.LoadPipelineRequest.pipeline:type_name -> seldon.mlops.scheduler.Pipeline + 54, // 39: seldon.mlops.scheduler.Pipeline.steps:type_name -> seldon.mlops.scheduler.PipelineStep + 57, // 40: seldon.mlops.scheduler.Pipeline.output:type_name -> seldon.mlops.scheduler.PipelineOutput + 21, // 41: seldon.mlops.scheduler.Pipeline.kubernetesMeta:type_name -> seldon.mlops.scheduler.KubernetesMeta + 56, // 42: seldon.mlops.scheduler.Pipeline.input:type_name -> seldon.mlops.scheduler.PipelineInput + 71, // 43: seldon.mlops.scheduler.PipelineStep.tensorMap:type_name -> seldon.mlops.scheduler.PipelineStep.TensorMapEntry + 4, // 44: seldon.mlops.scheduler.PipelineStep.inputsJoin:type_name -> seldon.mlops.scheduler.PipelineStep.JoinOp + 4, // 45: seldon.mlops.scheduler.PipelineStep.triggersJoin:type_name -> seldon.mlops.scheduler.PipelineStep.JoinOp + 55, // 46: seldon.mlops.scheduler.PipelineStep.batch:type_name -> seldon.mlops.scheduler.Batch + 5, // 47: seldon.mlops.scheduler.PipelineInput.joinType:type_name -> seldon.mlops.scheduler.PipelineInput.JoinOp + 5, // 48: seldon.mlops.scheduler.PipelineInput.triggersJoin:type_name -> seldon.mlops.scheduler.PipelineInput.JoinOp + 72, // 49: seldon.mlops.scheduler.PipelineInput.tensorMap:type_name -> seldon.mlops.scheduler.PipelineInput.TensorMapEntry + 6, // 50: seldon.mlops.scheduler.PipelineOutput.stepsJoin:type_name -> seldon.mlops.scheduler.PipelineOutput.JoinOp + 73, // 51: seldon.mlops.scheduler.PipelineOutput.tensorMap:type_name -> seldon.mlops.scheduler.PipelineOutput.TensorMapEntry + 64, // 52: seldon.mlops.scheduler.PipelineStatusResponse.versions:type_name -> seldon.mlops.scheduler.PipelineWithState + 53, // 53: seldon.mlops.scheduler.PipelineWithState.pipeline:type_name -> seldon.mlops.scheduler.Pipeline + 65, // 54: seldon.mlops.scheduler.PipelineWithState.state:type_name -> seldon.mlops.scheduler.PipelineVersionState + 7, // 55: seldon.mlops.scheduler.PipelineVersionState.status:type_name -> seldon.mlops.scheduler.PipelineVersionState.PipelineStatus + 74, // 56: seldon.mlops.scheduler.PipelineVersionState.lastChangeTimestamp:type_name -> google.protobuf.Timestamp + 8, // 57: seldon.mlops.scheduler.ControlPlaneResponse.event:type_name -> seldon.mlops.scheduler.ControlPlaneResponse.Event + 31, // 58: seldon.mlops.scheduler.ModelVersionStatus.ModelReplicaStateEntry.value:type_name -> seldon.mlops.scheduler.ModelReplicaStatus + 37, // 59: seldon.mlops.scheduler.Scheduler.ServerNotify:input_type -> seldon.mlops.scheduler.ServerNotifyRequest + 9, // 60: seldon.mlops.scheduler.Scheduler.LoadModel:input_type -> seldon.mlops.scheduler.LoadModelRequest + 26, // 61: seldon.mlops.scheduler.Scheduler.UnloadModel:input_type -> seldon.mlops.scheduler.UnloadModelRequest + 51, // 62: seldon.mlops.scheduler.Scheduler.LoadPipeline:input_type -> seldon.mlops.scheduler.LoadPipelineRequest + 59, // 63: seldon.mlops.scheduler.Scheduler.UnloadPipeline:input_type -> seldon.mlops.scheduler.UnloadPipelineRequest + 41, // 64: seldon.mlops.scheduler.Scheduler.StartExperiment:input_type -> seldon.mlops.scheduler.StartExperimentRequest + 47, // 65: seldon.mlops.scheduler.Scheduler.StopExperiment:input_type -> seldon.mlops.scheduler.StopExperimentRequest + 32, // 66: seldon.mlops.scheduler.Scheduler.ServerStatus:input_type -> seldon.mlops.scheduler.ServerStatusRequest + 36, // 67: seldon.mlops.scheduler.Scheduler.ModelStatus:input_type -> seldon.mlops.scheduler.ModelStatusRequest + 61, // 68: seldon.mlops.scheduler.Scheduler.PipelineStatus:input_type -> seldon.mlops.scheduler.PipelineStatusRequest + 52, // 69: seldon.mlops.scheduler.Scheduler.ExperimentStatus:input_type -> seldon.mlops.scheduler.ExperimentStatusRequest + 66, // 70: seldon.mlops.scheduler.Scheduler.SchedulerStatus:input_type -> seldon.mlops.scheduler.SchedulerStatusRequest + 40, // 71: seldon.mlops.scheduler.Scheduler.SubscribeServerStatus:input_type -> seldon.mlops.scheduler.ServerSubscriptionRequest + 35, // 72: seldon.mlops.scheduler.Scheduler.SubscribeModelStatus:input_type -> seldon.mlops.scheduler.ModelSubscriptionRequest + 49, // 73: seldon.mlops.scheduler.Scheduler.SubscribeExperimentStatus:input_type -> seldon.mlops.scheduler.ExperimentSubscriptionRequest + 62, // 74: seldon.mlops.scheduler.Scheduler.SubscribePipelineStatus:input_type -> seldon.mlops.scheduler.PipelineSubscriptionRequest + 68, // 75: seldon.mlops.scheduler.Scheduler.SubscribeControlPlane:input_type -> seldon.mlops.scheduler.ControlPlaneSubscriptionRequest + 39, // 76: seldon.mlops.scheduler.Scheduler.ServerNotify:output_type -> seldon.mlops.scheduler.ServerNotifyResponse + 24, // 77: seldon.mlops.scheduler.Scheduler.LoadModel:output_type -> seldon.mlops.scheduler.LoadModelResponse + 27, // 78: seldon.mlops.scheduler.Scheduler.UnloadModel:output_type -> seldon.mlops.scheduler.UnloadModelResponse + 58, // 79: seldon.mlops.scheduler.Scheduler.LoadPipeline:output_type -> seldon.mlops.scheduler.LoadPipelineResponse + 60, // 80: seldon.mlops.scheduler.Scheduler.UnloadPipeline:output_type -> seldon.mlops.scheduler.UnloadPipelineResponse + 46, // 81: seldon.mlops.scheduler.Scheduler.StartExperiment:output_type -> seldon.mlops.scheduler.StartExperimentResponse + 48, // 82: seldon.mlops.scheduler.Scheduler.StopExperiment:output_type -> seldon.mlops.scheduler.StopExperimentResponse + 33, // 83: seldon.mlops.scheduler.Scheduler.ServerStatus:output_type -> seldon.mlops.scheduler.ServerStatusResponse + 28, // 84: seldon.mlops.scheduler.Scheduler.ModelStatus:output_type -> seldon.mlops.scheduler.ModelStatusResponse + 63, // 85: seldon.mlops.scheduler.Scheduler.PipelineStatus:output_type -> seldon.mlops.scheduler.PipelineStatusResponse + 50, // 86: seldon.mlops.scheduler.Scheduler.ExperimentStatus:output_type -> seldon.mlops.scheduler.ExperimentStatusResponse + 67, // 87: seldon.mlops.scheduler.Scheduler.SchedulerStatus:output_type -> seldon.mlops.scheduler.SchedulerStatusResponse + 33, // 88: seldon.mlops.scheduler.Scheduler.SubscribeServerStatus:output_type -> seldon.mlops.scheduler.ServerStatusResponse + 28, // 89: seldon.mlops.scheduler.Scheduler.SubscribeModelStatus:output_type -> seldon.mlops.scheduler.ModelStatusResponse + 50, // 90: seldon.mlops.scheduler.Scheduler.SubscribeExperimentStatus:output_type -> seldon.mlops.scheduler.ExperimentStatusResponse + 63, // 91: seldon.mlops.scheduler.Scheduler.SubscribePipelineStatus:output_type -> seldon.mlops.scheduler.PipelineStatusResponse + 69, // 92: seldon.mlops.scheduler.Scheduler.SubscribeControlPlane:output_type -> seldon.mlops.scheduler.ControlPlaneResponse + 76, // [76:93] is the sub-list for method output_type + 59, // [59:76] is the sub-list for method input_type + 59, // [59:59] is the sub-list for extension type_name + 59, // [59:59] is the sub-list for extension extendee + 0, // [0:59] is the sub-list for field type_name } func init() { file_mlops_scheduler_scheduler_proto_init() } @@ -5250,7 +5326,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[7].Exporter = func(v any, i int) any { - switch v := v.(*ModelRuntimeInfo); i { + switch v := v.(*LlmSpec); i { case 0: return &v.state case 1: @@ -5262,7 +5338,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[8].Exporter = func(v any, i int) any { - switch v := v.(*MLServerModelSettings); i { + switch v := v.(*ModelRuntimeInfo); i { case 0: return &v.state case 1: @@ -5274,7 +5350,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[9].Exporter = func(v any, i int) any { - switch v := v.(*TritonModelConfig); i { + switch v := v.(*MLServerModelSettings); i { case 0: return &v.state case 1: @@ -5286,7 +5362,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[10].Exporter = func(v any, i int) any { - switch v := v.(*TritonCPU); i { + switch v := v.(*TritonModelConfig); i { case 0: return &v.state case 1: @@ -5298,7 +5374,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[11].Exporter = func(v any, i int) any { - switch v := v.(*KubernetesMeta); i { + switch v := v.(*TritonCPU); i { case 0: return &v.state case 1: @@ -5310,7 +5386,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[12].Exporter = func(v any, i int) any { - switch v := v.(*StreamSpec); i { + switch v := v.(*KubernetesMeta); i { case 0: return &v.state case 1: @@ -5322,7 +5398,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[13].Exporter = func(v any, i int) any { - switch v := v.(*StorageConfig); i { + switch v := v.(*StreamSpec); i { case 0: return &v.state case 1: @@ -5334,7 +5410,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[14].Exporter = func(v any, i int) any { - switch v := v.(*LoadModelResponse); i { + switch v := v.(*StorageConfig); i { case 0: return &v.state case 1: @@ -5346,7 +5422,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[15].Exporter = func(v any, i int) any { - switch v := v.(*ModelReference); i { + switch v := v.(*LoadModelResponse); i { case 0: return &v.state case 1: @@ -5358,7 +5434,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[16].Exporter = func(v any, i int) any { - switch v := v.(*UnloadModelRequest); i { + switch v := v.(*ModelReference); i { case 0: return &v.state case 1: @@ -5370,7 +5446,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[17].Exporter = func(v any, i int) any { - switch v := v.(*UnloadModelResponse); i { + switch v := v.(*UnloadModelRequest); i { case 0: return &v.state case 1: @@ -5382,7 +5458,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[18].Exporter = func(v any, i int) any { - switch v := v.(*ModelStatusResponse); i { + switch v := v.(*UnloadModelResponse); i { case 0: return &v.state case 1: @@ -5394,7 +5470,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[19].Exporter = func(v any, i int) any { - switch v := v.(*ModelVersionStatus); i { + switch v := v.(*ModelStatusResponse); i { case 0: return &v.state case 1: @@ -5406,7 +5482,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[20].Exporter = func(v any, i int) any { - switch v := v.(*ModelStatus); i { + switch v := v.(*ModelVersionStatus); i { case 0: return &v.state case 1: @@ -5418,7 +5494,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[21].Exporter = func(v any, i int) any { - switch v := v.(*ModelReplicaStatus); i { + switch v := v.(*ModelStatus); i { case 0: return &v.state case 1: @@ -5430,7 +5506,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[22].Exporter = func(v any, i int) any { - switch v := v.(*ServerStatusRequest); i { + switch v := v.(*ModelReplicaStatus); i { case 0: return &v.state case 1: @@ -5442,7 +5518,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[23].Exporter = func(v any, i int) any { - switch v := v.(*ServerStatusResponse); i { + switch v := v.(*ServerStatusRequest); i { case 0: return &v.state case 1: @@ -5454,7 +5530,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[24].Exporter = func(v any, i int) any { - switch v := v.(*ServerReplicaResources); i { + switch v := v.(*ServerStatusResponse); i { case 0: return &v.state case 1: @@ -5466,7 +5542,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[25].Exporter = func(v any, i int) any { - switch v := v.(*ModelSubscriptionRequest); i { + switch v := v.(*ServerReplicaResources); i { case 0: return &v.state case 1: @@ -5478,7 +5554,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[26].Exporter = func(v any, i int) any { - switch v := v.(*ModelStatusRequest); i { + switch v := v.(*ModelSubscriptionRequest); i { case 0: return &v.state case 1: @@ -5490,7 +5566,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[27].Exporter = func(v any, i int) any { - switch v := v.(*ServerNotifyRequest); i { + switch v := v.(*ModelStatusRequest); i { case 0: return &v.state case 1: @@ -5502,7 +5578,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[28].Exporter = func(v any, i int) any { - switch v := v.(*ServerNotify); i { + switch v := v.(*ServerNotifyRequest); i { case 0: return &v.state case 1: @@ -5514,7 +5590,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[29].Exporter = func(v any, i int) any { - switch v := v.(*ServerNotifyResponse); i { + switch v := v.(*ServerNotify); i { case 0: return &v.state case 1: @@ -5526,7 +5602,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[30].Exporter = func(v any, i int) any { - switch v := v.(*ServerSubscriptionRequest); i { + switch v := v.(*ServerNotifyResponse); i { case 0: return &v.state case 1: @@ -5538,7 +5614,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[31].Exporter = func(v any, i int) any { - switch v := v.(*StartExperimentRequest); i { + switch v := v.(*ServerSubscriptionRequest); i { case 0: return &v.state case 1: @@ -5550,7 +5626,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[32].Exporter = func(v any, i int) any { - switch v := v.(*Experiment); i { + switch v := v.(*StartExperimentRequest); i { case 0: return &v.state case 1: @@ -5562,7 +5638,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[33].Exporter = func(v any, i int) any { - switch v := v.(*ExperimentConfig); i { + switch v := v.(*Experiment); i { case 0: return &v.state case 1: @@ -5574,7 +5650,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[34].Exporter = func(v any, i int) any { - switch v := v.(*ExperimentCandidate); i { + switch v := v.(*ExperimentConfig); i { case 0: return &v.state case 1: @@ -5586,7 +5662,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[35].Exporter = func(v any, i int) any { - switch v := v.(*ExperimentMirror); i { + switch v := v.(*ExperimentCandidate); i { case 0: return &v.state case 1: @@ -5598,7 +5674,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[36].Exporter = func(v any, i int) any { - switch v := v.(*StartExperimentResponse); i { + switch v := v.(*ExperimentMirror); i { case 0: return &v.state case 1: @@ -5610,7 +5686,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[37].Exporter = func(v any, i int) any { - switch v := v.(*StopExperimentRequest); i { + switch v := v.(*StartExperimentResponse); i { case 0: return &v.state case 1: @@ -5622,7 +5698,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[38].Exporter = func(v any, i int) any { - switch v := v.(*StopExperimentResponse); i { + switch v := v.(*StopExperimentRequest); i { case 0: return &v.state case 1: @@ -5634,7 +5710,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[39].Exporter = func(v any, i int) any { - switch v := v.(*ExperimentSubscriptionRequest); i { + switch v := v.(*StopExperimentResponse); i { case 0: return &v.state case 1: @@ -5646,7 +5722,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[40].Exporter = func(v any, i int) any { - switch v := v.(*ExperimentStatusResponse); i { + switch v := v.(*ExperimentSubscriptionRequest); i { case 0: return &v.state case 1: @@ -5658,7 +5734,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[41].Exporter = func(v any, i int) any { - switch v := v.(*LoadPipelineRequest); i { + switch v := v.(*ExperimentStatusResponse); i { case 0: return &v.state case 1: @@ -5670,7 +5746,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[42].Exporter = func(v any, i int) any { - switch v := v.(*ExperimentStatusRequest); i { + switch v := v.(*LoadPipelineRequest); i { case 0: return &v.state case 1: @@ -5682,7 +5758,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[43].Exporter = func(v any, i int) any { - switch v := v.(*Pipeline); i { + switch v := v.(*ExperimentStatusRequest); i { case 0: return &v.state case 1: @@ -5694,7 +5770,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[44].Exporter = func(v any, i int) any { - switch v := v.(*PipelineStep); i { + switch v := v.(*Pipeline); i { case 0: return &v.state case 1: @@ -5706,7 +5782,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[45].Exporter = func(v any, i int) any { - switch v := v.(*Batch); i { + switch v := v.(*PipelineStep); i { case 0: return &v.state case 1: @@ -5718,7 +5794,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[46].Exporter = func(v any, i int) any { - switch v := v.(*PipelineInput); i { + switch v := v.(*Batch); i { case 0: return &v.state case 1: @@ -5730,7 +5806,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[47].Exporter = func(v any, i int) any { - switch v := v.(*PipelineOutput); i { + switch v := v.(*PipelineInput); i { case 0: return &v.state case 1: @@ -5742,7 +5818,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[48].Exporter = func(v any, i int) any { - switch v := v.(*LoadPipelineResponse); i { + switch v := v.(*PipelineOutput); i { case 0: return &v.state case 1: @@ -5754,7 +5830,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[49].Exporter = func(v any, i int) any { - switch v := v.(*UnloadPipelineRequest); i { + switch v := v.(*LoadPipelineResponse); i { case 0: return &v.state case 1: @@ -5766,7 +5842,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[50].Exporter = func(v any, i int) any { - switch v := v.(*UnloadPipelineResponse); i { + switch v := v.(*UnloadPipelineRequest); i { case 0: return &v.state case 1: @@ -5778,7 +5854,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[51].Exporter = func(v any, i int) any { - switch v := v.(*PipelineStatusRequest); i { + switch v := v.(*UnloadPipelineResponse); i { case 0: return &v.state case 1: @@ -5790,7 +5866,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[52].Exporter = func(v any, i int) any { - switch v := v.(*PipelineSubscriptionRequest); i { + switch v := v.(*PipelineStatusRequest); i { case 0: return &v.state case 1: @@ -5802,7 +5878,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[53].Exporter = func(v any, i int) any { - switch v := v.(*PipelineStatusResponse); i { + switch v := v.(*PipelineSubscriptionRequest); i { case 0: return &v.state case 1: @@ -5814,7 +5890,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[54].Exporter = func(v any, i int) any { - switch v := v.(*PipelineWithState); i { + switch v := v.(*PipelineStatusResponse); i { case 0: return &v.state case 1: @@ -5826,7 +5902,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[55].Exporter = func(v any, i int) any { - switch v := v.(*PipelineVersionState); i { + switch v := v.(*PipelineWithState); i { case 0: return &v.state case 1: @@ -5838,7 +5914,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[56].Exporter = func(v any, i int) any { - switch v := v.(*SchedulerStatusRequest); i { + switch v := v.(*PipelineVersionState); i { case 0: return &v.state case 1: @@ -5850,7 +5926,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[57].Exporter = func(v any, i int) any { - switch v := v.(*SchedulerStatusResponse); i { + switch v := v.(*SchedulerStatusRequest); i { case 0: return &v.state case 1: @@ -5862,7 +5938,7 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[58].Exporter = func(v any, i int) any { - switch v := v.(*ControlPlaneSubscriptionRequest); i { + switch v := v.(*SchedulerStatusResponse); i { case 0: return &v.state case 1: @@ -5874,6 +5950,18 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[59].Exporter = func(v any, i int) any { + switch v := v.(*ControlPlaneSubscriptionRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_mlops_scheduler_scheduler_proto_msgTypes[60].Exporter = func(v any, i int) any { switch v := v.(*ControlPlaneResponse); i { case 0: return &v.state @@ -5889,36 +5977,37 @@ func file_mlops_scheduler_scheduler_proto_init() { file_mlops_scheduler_scheduler_proto_msgTypes[2].OneofWrappers = []any{} file_mlops_scheduler_scheduler_proto_msgTypes[4].OneofWrappers = []any{} file_mlops_scheduler_scheduler_proto_msgTypes[6].OneofWrappers = []any{} - file_mlops_scheduler_scheduler_proto_msgTypes[7].OneofWrappers = []any{ + file_mlops_scheduler_scheduler_proto_msgTypes[7].OneofWrappers = []any{} + file_mlops_scheduler_scheduler_proto_msgTypes[8].OneofWrappers = []any{ (*ModelRuntimeInfo_Mlserver)(nil), (*ModelRuntimeInfo_Triton)(nil), } - file_mlops_scheduler_scheduler_proto_msgTypes[13].OneofWrappers = []any{ + file_mlops_scheduler_scheduler_proto_msgTypes[14].OneofWrappers = []any{ (*StorageConfig_StorageSecretName)(nil), (*StorageConfig_StorageRcloneConfig)(nil), } - file_mlops_scheduler_scheduler_proto_msgTypes[15].OneofWrappers = []any{} file_mlops_scheduler_scheduler_proto_msgTypes[16].OneofWrappers = []any{} - file_mlops_scheduler_scheduler_proto_msgTypes[19].OneofWrappers = []any{} - file_mlops_scheduler_scheduler_proto_msgTypes[22].OneofWrappers = []any{} + file_mlops_scheduler_scheduler_proto_msgTypes[17].OneofWrappers = []any{} + file_mlops_scheduler_scheduler_proto_msgTypes[20].OneofWrappers = []any{} file_mlops_scheduler_scheduler_proto_msgTypes[23].OneofWrappers = []any{} - file_mlops_scheduler_scheduler_proto_msgTypes[26].OneofWrappers = []any{} - file_mlops_scheduler_scheduler_proto_msgTypes[28].OneofWrappers = []any{} - file_mlops_scheduler_scheduler_proto_msgTypes[32].OneofWrappers = []any{} - file_mlops_scheduler_scheduler_proto_msgTypes[40].OneofWrappers = []any{} - file_mlops_scheduler_scheduler_proto_msgTypes[42].OneofWrappers = []any{} + file_mlops_scheduler_scheduler_proto_msgTypes[24].OneofWrappers = []any{} + file_mlops_scheduler_scheduler_proto_msgTypes[27].OneofWrappers = []any{} + file_mlops_scheduler_scheduler_proto_msgTypes[29].OneofWrappers = []any{} + file_mlops_scheduler_scheduler_proto_msgTypes[33].OneofWrappers = []any{} + file_mlops_scheduler_scheduler_proto_msgTypes[41].OneofWrappers = []any{} file_mlops_scheduler_scheduler_proto_msgTypes[43].OneofWrappers = []any{} file_mlops_scheduler_scheduler_proto_msgTypes[44].OneofWrappers = []any{} file_mlops_scheduler_scheduler_proto_msgTypes[45].OneofWrappers = []any{} file_mlops_scheduler_scheduler_proto_msgTypes[46].OneofWrappers = []any{} - file_mlops_scheduler_scheduler_proto_msgTypes[51].OneofWrappers = []any{} + file_mlops_scheduler_scheduler_proto_msgTypes[47].OneofWrappers = []any{} + file_mlops_scheduler_scheduler_proto_msgTypes[52].OneofWrappers = []any{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_mlops_scheduler_scheduler_proto_rawDesc, NumEnums: 9, - NumMessages: 64, + NumMessages: 65, NumExtensions: 0, NumServices: 1, }, diff --git a/apis/mlops/scheduler/scheduler.proto b/apis/mlops/scheduler/scheduler.proto index 3e324135f6..14cf08d216 100644 --- a/apis/mlops/scheduler/scheduler.proto +++ b/apis/mlops/scheduler/scheduler.proto @@ -43,8 +43,9 @@ message ModelSpec { optional uint64 memoryBytes = 5; // Requested memory optional string server = 6; // the particular model server to load the model. If unspecified will be chosen. optional ExplainerSpec explainer = 7; // optional black box explainer details - repeated ParameterSpec parameters = 8; // parameters to load with model - optional ModelRuntimeInfo modelRuntimeInfo = 9; // model specific settings that are sent by the agent + optional LlmSpec llm = 8; // LLM specific settings + repeated ParameterSpec parameters = 9; // parameters to load with model + optional ModelRuntimeInfo modelRuntimeInfo = 10; // model specific settings that are sent by the agent } message ParameterSpec { @@ -59,6 +60,11 @@ message ExplainerSpec { optional string pipelineRef = 3; } +message LlmSpec { + optional string modelRef = 1; + optional string pipelineRef = 2; +} + message ModelRuntimeInfo { oneof modelRuntimeInfo { MLServerModelSettings mlserver = 1; From 9c5a0d8b19f1bb8a87d9bf0b2d3561677c5e50b2 Mon Sep 17 00:00:00 2001 From: Robert Date: Mon, 27 Jan 2025 11:10:23 +0000 Subject: [PATCH 04/18] Generated k8s crds --- .../templates/seldon-v2-crds.yaml | 12 ++++++++++++ k8s/yaml/crds.yaml | 12 ++++++++++++ 2 files changed, 24 insertions(+) diff --git a/k8s/helm-charts/seldon-core-v2-crds/templates/seldon-v2-crds.yaml b/k8s/helm-charts/seldon-core-v2-crds/templates/seldon-v2-crds.yaml index 64d9fdfb21..78ec45d7ec 100644 --- a/k8s/helm-charts/seldon-core-v2-crds/templates/seldon-v2-crds.yaml +++ b/k8s/helm-charts/seldon-core-v2-crds/templates/seldon-v2-crds.yaml @@ -235,6 +235,18 @@ spec: description: type of explainer type: string type: object + llm: + description: LLMs spec + properties: + modelRef: + description: |- + one of the following need to be set for LLMs + Reference to Model + type: string + pipelineRef: + description: Reference to Pipeline + type: string + type: object logger: description: Payload logging properties: diff --git a/k8s/yaml/crds.yaml b/k8s/yaml/crds.yaml index 13c57f5b5c..5488374430 100644 --- a/k8s/yaml/crds.yaml +++ b/k8s/yaml/crds.yaml @@ -238,6 +238,18 @@ spec: description: type of explainer type: string type: object + llm: + description: LLMs spec + properties: + modelRef: + description: |- + one of the following need to be set for LLMs + Reference to Model + type: string + pipelineRef: + description: Reference to Pipeline + type: string + type: object logger: description: Payload logging properties: From 1df90d1772241c77f38a7bab4c808c6578829297 Mon Sep 17 00:00:00 2001 From: Robert Date: Mon, 27 Jan 2025 12:17:02 +0000 Subject: [PATCH 05/18] Refactored SetExplainer and SetLlm to avoid code duplication --- .../pkg/agent/repository/mlserver/mlserver.go | 141 ++++++++++-------- .../repository/mlserver/mlserver_test.go | 4 +- 2 files changed, 77 insertions(+), 68 deletions(-) diff --git a/scheduler/pkg/agent/repository/mlserver/mlserver.go b/scheduler/pkg/agent/repository/mlserver/mlserver.go index 6acd974e29..0bcac07cb3 100644 --- a/scheduler/pkg/agent/repository/mlserver/mlserver.go +++ b/scheduler/pkg/agent/repository/mlserver/mlserver.go @@ -160,84 +160,93 @@ func (m *MLServerRepositoryHandler) updateNameAndVersion(path string, modelName return os.WriteFile(settingsPath, data, fs.ModePerm) } -func (m *MLServerRepositoryHandler) SetExplainer(modelRepoPath string, explainerSpec *scheduler.ExplainerSpec, envoyHost string, envoyPort int) error { - if explainerSpec != nil { - workers := 0 - settingsPath := filepath.Join(modelRepoPath, mlserverConfigFilename) - ms, err := m.loadModelSettingsFromFile(settingsPath) - if err != nil { - return err - } - // TODO: temporary fix for issue in mlserver with explainers - ms.ParallelWorkers = &workers - if ms.Parameters == nil { - ms.Parameters = &ModelParameters{} - } - if ms.Parameters.Extra == nil { - ms.Parameters.Extra = map[string]interface{}{} - } - ms.Parameters.Extra[explainerTypeKey] = &explainerSpec.Type - scheme := "http" - if m.SSL { - scheme = "https" - ms.Parameters.Extra[sslVerifyPath] = "/mnt/certs/ca.crt" - } - if explainerSpec.ModelRef != nil { - inferUri := fmt.Sprintf("%s://%s:%d/v2/models/%s/infer", scheme, envoyHost, envoyPort, *explainerSpec.ModelRef) - ms.Parameters.Extra[inferUriKey] = &inferUri - } else if explainerSpec.PipelineRef != nil { - inferUri := fmt.Sprintf("%s://%s:%d/v2/pipelines/%s/infer", scheme, envoyHost, envoyPort, *explainerSpec.PipelineRef) - ms.Parameters.Extra[inferUriKey] = &inferUri - } - data, err := json.Marshal(ms) - if err != nil { - return err - } - return os.WriteFile(settingsPath, data, fs.ModePerm) +func (m *MLServerRepositoryHandler) setModelSettings( + modelRepoPath string, + modelRef *string, + pipelineRef *string, + envoyHost string, + envoyPort int, + customize func(*ModelSettings) error, +) error { + workers := 0 + settingsPath := filepath.Join(modelRepoPath, mlserverConfigFilename) + ms, err := m.loadModelSettingsFromFile(settingsPath) + if err != nil { + return err } - return nil -} -func (m *MLServerRepositoryHandler) SetLlm(modelRepoPath string, llmSpec *scheduler.LlmSpec, envoyHost string, envoyPort int) error { - if llmSpec != nil { - workers := 0 - settingsPath := filepath.Join(modelRepoPath, mlserverConfigFilename) - ms, err := m.loadModelSettingsFromFile(settingsPath) - if err != nil { - return err - } + //TODO: temporary fix for issue in mlserver with explainers + ms.ParallelWorkers = &workers + if ms.Parameters == nil { + ms.Parameters = &ModelParameters{} + } - ms.ParallelWorkers = &workers - if ms.Parameters == nil { - ms.Parameters = &ModelParameters{} - } + if ms.Parameters.Extra == nil { + ms.Parameters.Extra = map[string]interface{}{} + } - if ms.Parameters.Extra == nil { - ms.Parameters.Extra = map[string]interface{}{} - } + scheme := "http" + if m.SSL { + scheme = "https" + ms.Parameters.Extra[sslVerifyPath] = "/mnt/certs/ca.crt" + } - scheme := "http" - if m.SSL { - scheme = "https" - ms.Parameters.Extra[sslVerifyPath] = "/mnt/certs/ca.crt" - } - if llmSpec.ModelRef != nil { - inferUri := fmt.Sprintf("%s://%s:%d/v2/models/%s/infer", scheme, envoyHost, envoyPort, *llmSpec.ModelRef) - ms.Parameters.Extra["url"] = &inferUri - } else if llmSpec.PipelineRef != nil { - inferUri := fmt.Sprintf("%s://%s:%d/v2/models/%s/infer", scheme, envoyHost, envoyPort, *llmSpec.ModelRef) - ms.Parameters.Extra["url"] = &inferUri - } + var inferUri string + if modelRef != nil { + inferUri = fmt.Sprintf("%s://%s:%d/v2/models/%s/infer", scheme, envoyHost, envoyPort, *modelRef) + } else { + inferUri = fmt.Sprintf("%s://%s:%d/v2/pipelines/%s/infer", scheme, envoyHost, envoyPort, *pipelineRef) + } - data, err := json.Marshal(ms) - if err != nil { + if inferUri != "" { + ms.Parameters.Extra[inferUriKey] = &inferUri + } + + // custom logic for specifc callser + if customize != nil { + if err := customize(ms); err != nil { return err } - return os.WriteFile(settingsPath, data, fs.ModePerm) + } + + data, err := json.Marshal(ms) + if err != nil { + return err + } + + return os.WriteFile(settingsPath, data, fs.ModePerm) + +} +func (m *MLServerRepositoryHandler) SetExplainer(modelRepoPath string, explainerSpec *scheduler.ExplainerSpec, envoyHost string, envoyPort int) error { + if explainerSpec != nil { + return m.setModelSettings( + modelRepoPath, + explainerSpec.ModelRef, + explainerSpec.PipelineRef, + envoyHost, + envoyPort, + func(ms *ModelSettings) error { + ms.Parameters.Extra[explainerTypeKey] = &explainerSpec.Type + return nil + }, + ) } return nil +} +func (m *MLServerRepositoryHandler) SetLlm(modelRepoPath string, llmSpec *scheduler.LlmSpec, envoyHost string, envoyPort int) error { + if llmSpec != nil { + return m.setModelSettings( + modelRepoPath, + llmSpec.ModelRef, + llmSpec.PipelineRef, + envoyHost, + envoyPort, + nil, + ) + } + return nil } func (m *MLServerRepositoryHandler) SetExtraParameters(modelRepoPath string, parameters []*scheduler.ParameterSpec) error { diff --git a/scheduler/pkg/agent/repository/mlserver/mlserver_test.go b/scheduler/pkg/agent/repository/mlserver/mlserver_test.go index 2eeab930c2..eda0b968fc 100644 --- a/scheduler/pkg/agent/repository/mlserver/mlserver_test.go +++ b/scheduler/pkg/agent/repository/mlserver/mlserver_test.go @@ -123,7 +123,7 @@ func TestSetLlm(t *testing.T) { Parameters: &ModelParameters{ Version: "1", Extra: map[string]interface{}{ - "url": "http://0.0.0.0:9000/v2/models/mymodel/infer", + inferUriKey: "http://0.0.0.0:9000/v2/models/mymodel/infer", "prompt_utils": map[string]interface{}{ "model_type": "chat.completions", }, @@ -144,7 +144,7 @@ func TestSetLlm(t *testing.T) { g.Expect(err).To(BeNil()) modelSettings, err := m.loadModelSettingsFromFile(settingsFile) g.Expect(err).To(BeNil()) - g.Expect(modelSettings.Parameters.Extra["url"]).To(Equal(test.expected.Parameters.Extra["url"])) + g.Expect(modelSettings.Parameters.Extra[inferUriKey]).To(Equal(test.expected.Parameters.Extra[inferUriKey])) g.Expect(modelSettings.Parameters.Extra["prompt_utils"]).To(Equal(test.expected.Parameters.Extra["prompt_utils"])) }) From 5ce0906afaba63ca48acb1287283d96c05ca643a Mon Sep 17 00:00:00 2001 From: Robert Date: Mon, 27 Jan 2025 12:45:20 +0000 Subject: [PATCH 06/18] Refactored TestSetExplainer and TestSetLlm to avoid code duplication --- .../repository/mlserver/mlserver_test.go | 116 +++++++++--------- 1 file changed, 57 insertions(+), 59 deletions(-) diff --git a/scheduler/pkg/agent/repository/mlserver/mlserver_test.go b/scheduler/pkg/agent/repository/mlserver/mlserver_test.go index eda0b968fc..f1849b8d26 100644 --- a/scheduler/pkg/agent/repository/mlserver/mlserver_test.go +++ b/scheduler/pkg/agent/repository/mlserver/mlserver_test.go @@ -23,29 +23,49 @@ import ( "github.com/seldonio/seldon-core/apis/go/v2/mlops/scheduler" ) -func TestSetExplainer(t *testing.T) { +func TestSetModelSettings(t *testing.T) { g := NewGomegaWithT(t) - envoyHost := "0.0.0.0" envoyPort := 9000 + type test struct { - name string - data []byte - explainerSpec *scheduler.ExplainerSpec - expected *ModelSettings + name string + data []byte + spec interface{} + handler func(*MLServerRepositoryHandler, string, interface{}, string, int) error + assertion func(*GomegaWithT, *ModelSettings) } getStrPr := func(str string) *string { return &str } + + // define assertion functions + validateExplainer := func(g *GomegaWithT, expected *ModelSettings) func(*GomegaWithT, *ModelSettings) { + return func(g *GomegaWithT, settings *ModelSettings) { + g.Expect(settings.Parameters.Extra[explainerTypeKey]).To(Equal(expected.Parameters.Extra[explainerTypeKey])) + g.Expect(settings.Parameters.Extra[inferUriKey]).To(Equal(expected.Parameters.Extra[inferUriKey])) + + } + } + + validateLlm := func(g *GomegaWithT, expected *ModelSettings) func(*GomegaWithT, *ModelSettings) { + return func(g *GomegaWithT, settings *ModelSettings) { + g.Expect(settings.Parameters.Extra[inferUriKey]).To(Equal(expected.Parameters.Extra[inferUriKey])) + g.Expect(settings.Parameters.Extra["prompt_utils"]).To(Equal(expected.Parameters.Extra["prompt_utils"])) + } + } + tests := []test{ { - name: "basic", - data: []byte(`{"name": "iris","implementation": "mlserver_sklearn.SKLearnModel", -"parameters": {"version": "1", "extra":{}}}`), - explainerSpec: &scheduler.ExplainerSpec{ + name: "set explainer - basic", + data: []byte(`{"name": "iris","implementation": "mlserver_sklearn.SKLearnModel", "parameters": {"version": "1", "extra":{}}}`), + spec: &scheduler.ExplainerSpec{ Type: "anchor_tabular", ModelRef: getStrPr("mymodel"), }, - expected: &ModelSettings{ + handler: func(m *MLServerRepositoryHandler, path string, spec interface{}, host string, port int) error { + return m.SetExplainer(path, spec.(*scheduler.ExplainerSpec), host, port) + }, + assertion: validateExplainer(g, &ModelSettings{ Name: "iris", Implementation: "mlserver_sklearn.SKLearnModel", Parameters: &ModelParameters{ @@ -55,17 +75,19 @@ func TestSetExplainer(t *testing.T) { inferUriKey: "http://0.0.0.0:9000/v2/models/mymodel/infer", }, }, - }, + }), }, { - name: "explainer parameters", - data: []byte(`{"name": "iris","implementation": "mlserver_sklearn.SKLearnModel", -"parameters": {"version": "1", "extra":{"init_parameters":{"threshold":0.95}}}}`), - explainerSpec: &scheduler.ExplainerSpec{ + name: "set explainer - parameters", + data: []byte(`{"name": "iris","implementation": "mlserver_sklearn.SKLearnModel", "parameters": {"version": "1", "extra":{"init_parameters":{"threshold":0.95}}}}`), + spec: &scheduler.ExplainerSpec{ Type: "anchor_tabular", ModelRef: getStrPr("mymodel"), }, - expected: &ModelSettings{ + handler: func(m *MLServerRepositoryHandler, path string, spec interface{}, host string, port int) error { + return m.SetExplainer(path, spec.(*scheduler.ExplainerSpec), host, port) + }, + assertion: validateExplainer(g, &ModelSettings{ Name: "iris", Implementation: "mlserver_sklearn.SKLearnModel", Parameters: &ModelParameters{ @@ -75,49 +97,18 @@ func TestSetExplainer(t *testing.T) { inferUriKey: "http://0.0.0.0:9000/v2/models/mymodel/infer", }, }, - }, + }), }, - } - - for _, test := range tests { - t.Run(test.name, func(t *testing.T) { - modelRepoPath := t.TempDir() - settingsFile := filepath.Join(modelRepoPath, mlserverConfigFilename) - err := os.WriteFile(settingsFile, test.data, os.ModePerm) - g.Expect(err).To(BeNil()) - m := &MLServerRepositoryHandler{} - err = m.SetExplainer(modelRepoPath, test.explainerSpec, envoyHost, envoyPort) - g.Expect(err).To(BeNil()) - modelSettings, err := m.loadModelSettingsFromFile(settingsFile) - g.Expect(err).To(BeNil()) - g.Expect(modelSettings.Parameters.Extra[explainerTypeKey]).To(Equal(test.expected.Parameters.Extra[explainerTypeKey])) - g.Expect(modelSettings.Parameters.Extra[inferUriKey]).To(Equal(test.expected.Parameters.Extra[inferUriKey])) - }) - } -} - -func TestSetLlm(t *testing.T) { - g := NewGomegaWithT(t) - - envoyHost := "0.0.0.0" - envoyPort := 9000 - type test struct { - name string - data []byte - llmSpec *scheduler.LlmSpec - expected *ModelSettings - } - - getStrPr := func(str string) *string { return &str } - tests := []test{ { name: "chat-completion", - data: []byte(`{"name": "chat-completion","implementation": "mlserver_prompt_utils.runtime.PromptRuntime", -"parameters": {"version": "1", "extra":{"prompt_utils": {"model_type": "chat.completions"}}}}`), - llmSpec: &scheduler.LlmSpec{ + data: []byte(`{"name": "chat-completion","implementation": "mlserver_prompt_utils.runtime.PromptRuntime", "parameters": {"version": "1", "extra":{"prompt_utils": {"model_type": "chat.completions"}}}}`), + spec: &scheduler.LlmSpec{ ModelRef: getStrPr("mymodel"), }, - expected: &ModelSettings{ + handler: func(m *MLServerRepositoryHandler, path string, spec interface{}, host string, port int) error { + return m.SetLlm(path, spec.(*scheduler.LlmSpec), host, port) + }, + assertion: validateLlm(g, &ModelSettings{ Name: "chat-completion", Implementation: "mlserver_prompt_utils.runtime.PromptRuntime", Parameters: &ModelParameters{ @@ -129,7 +120,7 @@ func TestSetLlm(t *testing.T) { }, }, }, - }, + }), }, } @@ -137,15 +128,22 @@ func TestSetLlm(t *testing.T) { t.Run(test.name, func(t *testing.T) { modelRepoPath := t.TempDir() settingsFile := filepath.Join(modelRepoPath, mlserverConfigFilename) + + // write the model settings to a file err := os.WriteFile(settingsFile, test.data, os.ModePerm) g.Expect(err).To(BeNil()) + m := &MLServerRepositoryHandler{} - err = m.SetLlm(modelRepoPath, test.llmSpec, envoyHost, envoyPort) + + // call the andler + err = test.handler(m, modelRepoPath, test.spec, envoyHost, envoyPort) g.Expect(err).To(BeNil()) + + // load model settings and perofrm assertion modelSettings, err := m.loadModelSettingsFromFile(settingsFile) g.Expect(err).To(BeNil()) - g.Expect(modelSettings.Parameters.Extra[inferUriKey]).To(Equal(test.expected.Parameters.Extra[inferUriKey])) - g.Expect(modelSettings.Parameters.Extra["prompt_utils"]).To(Equal(test.expected.Parameters.Extra["prompt_utils"])) + + test.assertion(g, modelSettings) }) } From f8db9f32150243648e452d0e4c9390cb0c01e4ec Mon Sep 17 00:00:00 2001 From: Robert Date: Mon, 27 Jan 2025 13:26:46 +0000 Subject: [PATCH 07/18] Fixed operator test for model types --- operator/apis/mlops/v1alpha1/model_types_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/operator/apis/mlops/v1alpha1/model_types_test.go b/operator/apis/mlops/v1alpha1/model_types_test.go index 897bb15f44..e79ef8d76f 100644 --- a/operator/apis/mlops/v1alpha1/model_types_test.go +++ b/operator/apis/mlops/v1alpha1/model_types_test.go @@ -128,7 +128,7 @@ func TestAsModelDetails(t *testing.T) { Type: "anchor_tabular", ModelRef: &incomeModel, }, - Llm: &scheduler.LLMSpec{ + Llm: &scheduler.LlmSpec{ ModelRef: &llmModel, }, Parameters: []*scheduler.ParameterSpec{ From 75285d7e4a481cfe79e701614675e0c07039fafb Mon Sep 17 00:00:00 2001 From: Robert Date: Mon, 27 Jan 2025 16:55:57 +0000 Subject: [PATCH 08/18] Fixed operator model_types --- operator/apis/mlops/v1alpha1/model_types.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/operator/apis/mlops/v1alpha1/model_types.go b/operator/apis/mlops/v1alpha1/model_types.go index c49ee61007..298649630e 100644 --- a/operator/apis/mlops/v1alpha1/model_types.go +++ b/operator/apis/mlops/v1alpha1/model_types.go @@ -181,7 +181,7 @@ func (m Model) AsSchedulerModel() (*scheduler.Model, error) { } } if m.Spec.Llm != nil { - md.ModelSpec.Llm = &scheduler.LLMSpec{ + md.ModelSpec.Llm = &scheduler.LlmSpec{ ModelRef: m.Spec.Llm.ModelRef, PipelineRef: m.Spec.Llm.PipelineRef, } From 78b3c71bf2fdc85b395e7134bbe3c8bac63c82f2 Mon Sep 17 00:00:00 2001 From: Robert Date: Mon, 27 Jan 2025 17:14:34 +0000 Subject: [PATCH 09/18] Fixed crd config --- .../seldon-core-v2-crds/templates/seldon-v2-crds.yaml | 4 ++-- k8s/yaml/crds.yaml | 4 ++-- operator/config/crd/bases/mlops.seldon.io_models.yaml | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/k8s/helm-charts/seldon-core-v2-crds/templates/seldon-v2-crds.yaml b/k8s/helm-charts/seldon-core-v2-crds/templates/seldon-v2-crds.yaml index 78ec45d7ec..1af7cc7ede 100644 --- a/k8s/helm-charts/seldon-core-v2-crds/templates/seldon-v2-crds.yaml +++ b/k8s/helm-charts/seldon-core-v2-crds/templates/seldon-v2-crds.yaml @@ -236,11 +236,11 @@ spec: type: string type: object llm: - description: LLMs spec + description: LLM spec properties: modelRef: description: |- - one of the following need to be set for LLMs + one of the following need to be set for the LLM Reference to Model type: string pipelineRef: diff --git a/k8s/yaml/crds.yaml b/k8s/yaml/crds.yaml index 5488374430..c68c604cb3 100644 --- a/k8s/yaml/crds.yaml +++ b/k8s/yaml/crds.yaml @@ -239,11 +239,11 @@ spec: type: string type: object llm: - description: LLMs spec + description: LLM spec properties: modelRef: description: |- - one of the following need to be set for LLMs + one of the following need to be set for the LLM Reference to Model type: string pipelineRef: diff --git a/operator/config/crd/bases/mlops.seldon.io_models.yaml b/operator/config/crd/bases/mlops.seldon.io_models.yaml index 9581c375a3..58001c3540 100644 --- a/operator/config/crd/bases/mlops.seldon.io_models.yaml +++ b/operator/config/crd/bases/mlops.seldon.io_models.yaml @@ -80,11 +80,11 @@ spec: type: string type: object llm: - description: LLMs spec + description: LLM spec properties: modelRef: description: |- - one of the following need to be set for LLMs + one of the following need to be set for the LLM Reference to Model type: string pipelineRef: From a698f39d1a818ff4190970f601ce867bef4e24cd Mon Sep 17 00:00:00 2001 From: Robert Date: Mon, 27 Jan 2025 18:09:57 +0000 Subject: [PATCH 10/18] Regenerated manifests and deepcopy --- .../seldon-core-v2-crds/templates/seldon-v2-crds.yaml | 4 ++-- k8s/yaml/crds.yaml | 4 ++-- operator/apis/mlops/v1alpha1/model_types.go | 1 + operator/apis/mlops/v1alpha1/zz_generated.deepcopy.go | 3 +-- operator/config/crd/bases/mlops.seldon.io_models.yaml | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/k8s/helm-charts/seldon-core-v2-crds/templates/seldon-v2-crds.yaml b/k8s/helm-charts/seldon-core-v2-crds/templates/seldon-v2-crds.yaml index 1af7cc7ede..c2163fbbcb 100644 --- a/k8s/helm-charts/seldon-core-v2-crds/templates/seldon-v2-crds.yaml +++ b/k8s/helm-charts/seldon-core-v2-crds/templates/seldon-v2-crds.yaml @@ -236,11 +236,11 @@ spec: type: string type: object llm: - description: LLM spec + description: Llm spec properties: modelRef: description: |- - one of the following need to be set for the LLM + one of the following need to be set for the llm Reference to Model type: string pipelineRef: diff --git a/k8s/yaml/crds.yaml b/k8s/yaml/crds.yaml index c68c604cb3..20e3a82c2f 100644 --- a/k8s/yaml/crds.yaml +++ b/k8s/yaml/crds.yaml @@ -239,11 +239,11 @@ spec: type: string type: object llm: - description: LLM spec + description: Llm spec properties: modelRef: description: |- - one of the following need to be set for the LLM + one of the following need to be set for the llm Reference to Model type: string pipelineRef: diff --git a/operator/apis/mlops/v1alpha1/model_types.go b/operator/apis/mlops/v1alpha1/model_types.go index 298649630e..fafc5d10a6 100644 --- a/operator/apis/mlops/v1alpha1/model_types.go +++ b/operator/apis/mlops/v1alpha1/model_types.go @@ -68,6 +68,7 @@ type ExplainerSpec struct { // Either ModelRef or PipelineRef is required type LlmSpec struct { + // one of the following need to be set for the llm // Reference to Model // +optional ModelRef *string `json:"modelRef,omitempty"` diff --git a/operator/apis/mlops/v1alpha1/zz_generated.deepcopy.go b/operator/apis/mlops/v1alpha1/zz_generated.deepcopy.go index 791aebe0f8..f058a0e1ba 100644 --- a/operator/apis/mlops/v1alpha1/zz_generated.deepcopy.go +++ b/operator/apis/mlops/v1alpha1/zz_generated.deepcopy.go @@ -1,5 +1,4 @@ //go:build !ignore_autogenerated -// +build !ignore_autogenerated /* Copyright (c) 2024 Seldon Technologies Ltd. @@ -354,7 +353,7 @@ func (in *LlmSpec) DeepCopyInto(out *LlmSpec) { } } -// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LLMSpec. +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new LlmSpec. func (in *LlmSpec) DeepCopy() *LlmSpec { if in == nil { return nil diff --git a/operator/config/crd/bases/mlops.seldon.io_models.yaml b/operator/config/crd/bases/mlops.seldon.io_models.yaml index 58001c3540..270374db34 100644 --- a/operator/config/crd/bases/mlops.seldon.io_models.yaml +++ b/operator/config/crd/bases/mlops.seldon.io_models.yaml @@ -80,11 +80,11 @@ spec: type: string type: object llm: - description: LLM spec + description: Llm spec properties: modelRef: description: |- - one of the following need to be set for the LLM + one of the following need to be set for the llm Reference to Model type: string pipelineRef: From eeb7a78f269869b48a84c2f9e575ee8d755b1e06 Mon Sep 17 00:00:00 2001 From: RobertSamoilescu Date: Tue, 28 Jan 2025 14:29:02 +0000 Subject: [PATCH 11/18] Update scheduler/pkg/agent/repository/mlserver/mlserver.go Co-authored-by: Sherif Akoush --- scheduler/pkg/agent/repository/mlserver/mlserver.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scheduler/pkg/agent/repository/mlserver/mlserver.go b/scheduler/pkg/agent/repository/mlserver/mlserver.go index 0bcac07cb3..82735de074 100644 --- a/scheduler/pkg/agent/repository/mlserver/mlserver.go +++ b/scheduler/pkg/agent/repository/mlserver/mlserver.go @@ -202,7 +202,7 @@ func (m *MLServerRepositoryHandler) setModelSettings( ms.Parameters.Extra[inferUriKey] = &inferUri } - // custom logic for specifc callser + // custom logic for specific caller if customize != nil { if err := customize(ms); err != nil { return err From 8a12c76878f90b57da00040c4aad19072a20d45e Mon Sep 17 00:00:00 2001 From: Robert Date: Tue, 28 Jan 2025 14:43:26 +0000 Subject: [PATCH 12/18] Keep original id/ordering and make explainer and llm of type oneof --- apis/go/mlops/scheduler/scheduler.pb.go | 1515 ++++++++++++----------- apis/mlops/scheduler/scheduler.proto | 12 +- 2 files changed, 781 insertions(+), 746 deletions(-) diff --git a/apis/go/mlops/scheduler/scheduler.pb.go b/apis/go/mlops/scheduler/scheduler.pb.go index 24589e0134..28d7b47bbc 100644 --- a/apis/go/mlops/scheduler/scheduler.pb.go +++ b/apis/go/mlops/scheduler/scheduler.pb.go @@ -801,16 +801,21 @@ type ModelSpec struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Uri string `protobuf:"bytes,1,opt,name=uri,proto3" json:"uri,omitempty"` // storage uri from where to download the artifacts - ArtifactVersion *uint32 `protobuf:"varint,2,opt,name=artifactVersion,proto3,oneof" json:"artifactVersion,omitempty"` // Optional v2 version folder to select - StorageConfig *StorageConfig `protobuf:"bytes,3,opt,name=storageConfig,proto3,oneof" json:"storageConfig,omitempty"` // Storage auth configuration - Requirements []string `protobuf:"bytes,4,rep,name=requirements,proto3" json:"requirements,omitempty"` // list of capabilities the server must satisfy to run this model - MemoryBytes *uint64 `protobuf:"varint,5,opt,name=memoryBytes,proto3,oneof" json:"memoryBytes,omitempty"` // Requested memory - Server *string `protobuf:"bytes,6,opt,name=server,proto3,oneof" json:"server,omitempty"` // the particular model server to load the model. If unspecified will be chosen. - Explainer *ExplainerSpec `protobuf:"bytes,7,opt,name=explainer,proto3,oneof" json:"explainer,omitempty"` // optional black box explainer details - Llm *LlmSpec `protobuf:"bytes,8,opt,name=llm,proto3,oneof" json:"llm,omitempty"` // LLM specific settings - Parameters []*ParameterSpec `protobuf:"bytes,9,rep,name=parameters,proto3" json:"parameters,omitempty"` // parameters to load with model - ModelRuntimeInfo *ModelRuntimeInfo `protobuf:"bytes,10,opt,name=modelRuntimeInfo,proto3,oneof" json:"modelRuntimeInfo,omitempty"` // model specific settings that are sent by the agent + Uri string `protobuf:"bytes,1,opt,name=uri,proto3" json:"uri,omitempty"` // storage uri from where to download the artifacts + ArtifactVersion *uint32 `protobuf:"varint,2,opt,name=artifactVersion,proto3,oneof" json:"artifactVersion,omitempty"` // Optional v2 version folder to select + StorageConfig *StorageConfig `protobuf:"bytes,3,opt,name=storageConfig,proto3,oneof" json:"storageConfig,omitempty"` // Storage auth configuration + Requirements []string `protobuf:"bytes,4,rep,name=requirements,proto3" json:"requirements,omitempty"` // list of capabilities the server must satisfy to run this model + MemoryBytes *uint64 `protobuf:"varint,5,opt,name=memoryBytes,proto3,oneof" json:"memoryBytes,omitempty"` // Requested memory + Server *string `protobuf:"bytes,6,opt,name=server,proto3,oneof" json:"server,omitempty"` // the particular model server to load the model. If unspecified will be chosen. + Parameters []*ParameterSpec `protobuf:"bytes,8,rep,name=parameters,proto3" json:"parameters,omitempty"` // parameters to load with model + ModelRuntimeInfo *ModelRuntimeInfo `protobuf:"bytes,9,opt,name=modelRuntimeInfo,proto3,oneof" json:"modelRuntimeInfo,omitempty"` // model specific settings that are sent by the agent + // ensure only one of explainer or llm is specified at a time + // + // Types that are assignable to ModelSpec: + // + // *ModelSpec_Explainer + // *ModelSpec_Llm + ModelSpec isModelSpec_ModelSpec `protobuf_oneof:"model_spec"` } func (x *ModelSpec) Reset() { @@ -887,34 +892,57 @@ func (x *ModelSpec) GetServer() string { return "" } -func (x *ModelSpec) GetExplainer() *ExplainerSpec { +func (x *ModelSpec) GetParameters() []*ParameterSpec { if x != nil { - return x.Explainer + return x.Parameters } return nil } -func (x *ModelSpec) GetLlm() *LlmSpec { +func (x *ModelSpec) GetModelRuntimeInfo() *ModelRuntimeInfo { if x != nil { - return x.Llm + return x.ModelRuntimeInfo } return nil } -func (x *ModelSpec) GetParameters() []*ParameterSpec { - if x != nil { - return x.Parameters +func (m *ModelSpec) GetModelSpec() isModelSpec_ModelSpec { + if m != nil { + return m.ModelSpec } return nil } -func (x *ModelSpec) GetModelRuntimeInfo() *ModelRuntimeInfo { - if x != nil { - return x.ModelRuntimeInfo +func (x *ModelSpec) GetExplainer() *ExplainerSpec { + if x, ok := x.GetModelSpec().(*ModelSpec_Explainer); ok { + return x.Explainer } return nil } +func (x *ModelSpec) GetLlm() *LlmSpec { + if x, ok := x.GetModelSpec().(*ModelSpec_Llm); ok { + return x.Llm + } + return nil +} + +type isModelSpec_ModelSpec interface { + isModelSpec_ModelSpec() +} + +type ModelSpec_Explainer struct { + Explainer *ExplainerSpec `protobuf:"bytes,7,opt,name=explainer,proto3,oneof"` // optional black box explainer details +} + +type ModelSpec_Llm struct { + Llm *LlmSpec `protobuf:"bytes,10,opt,name=llm,proto3,oneof"` // optional LLM specific settings +} + +func (*ModelSpec_Explainer) isModelSpec_ModelSpec() {} + +func (*ModelSpec_Llm) isModelSpec_ModelSpec() {} + type ParameterSpec struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4281,766 +4309,766 @@ var file_mlops_scheduler_scheduler_proto_rawDesc = []byte{ 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x6c, 0x6f, 0x67, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x6c, 0x6f, 0x67, 0x50, 0x61, 0x79, 0x6c, 0x6f, - 0x61, 0x64, 0x73, 0x22, 0x96, 0x05, 0x0a, 0x09, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x53, 0x70, 0x65, + 0x61, 0x64, 0x73, 0x22, 0x88, 0x05, 0x0a, 0x09, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x53, 0x70, 0x65, 0x63, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x69, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x69, 0x12, 0x2d, 0x0a, 0x0f, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x00, 0x52, 0x0f, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x01, 0x52, 0x0f, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x50, 0x0a, 0x0d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x48, 0x01, 0x52, 0x0d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x48, 0x02, 0x52, 0x0d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x88, 0x01, 0x01, 0x12, 0x22, 0x0a, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x25, 0x0a, 0x0b, 0x6d, 0x65, 0x6d, 0x6f, - 0x72, 0x79, 0x42, 0x79, 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x48, 0x02, 0x52, + 0x72, 0x79, 0x42, 0x79, 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x48, 0x03, 0x52, 0x0b, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x42, 0x79, 0x74, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, - 0x03, 0x52, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x48, 0x0a, 0x09, - 0x65, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x25, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x48, 0x04, 0x52, 0x09, 0x65, 0x78, 0x70, 0x6c, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x03, 0x6c, 0x6c, 0x6d, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, - 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x4c, 0x6c, 0x6d, - 0x53, 0x70, 0x65, 0x63, 0x48, 0x05, 0x52, 0x03, 0x6c, 0x6c, 0x6d, 0x88, 0x01, 0x01, 0x12, 0x45, - 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, - 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x65, 0x74, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, - 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x59, 0x0a, 0x10, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x28, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x48, 0x06, 0x52, 0x10, 0x6d, 0x6f, 0x64, - 0x65, 0x6c, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x88, 0x01, 0x01, - 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, - 0x79, 0x42, 0x79, 0x74, 0x65, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x65, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x42, - 0x06, 0x0a, 0x04, 0x5f, 0x6c, 0x6c, 0x6d, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x6d, 0x6f, 0x64, 0x65, - 0x6c, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x39, 0x0a, 0x0d, - 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x88, 0x01, 0x0a, 0x0d, 0x45, 0x78, 0x70, 0x6c, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1f, 0x0a, - 0x08, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, - 0x00, 0x52, 0x08, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x66, 0x88, 0x01, 0x01, 0x12, 0x25, - 0x0a, 0x0b, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x66, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0b, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x52, - 0x65, 0x66, 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x52, - 0x65, 0x66, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x52, - 0x65, 0x66, 0x22, 0x6e, 0x0a, 0x07, 0x4c, 0x6c, 0x6d, 0x53, 0x70, 0x65, 0x63, 0x12, 0x1f, 0x0a, - 0x08, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, - 0x00, 0x52, 0x08, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x66, 0x88, 0x01, 0x01, 0x12, 0x25, - 0x0a, 0x0b, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x66, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0b, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x52, - 0x65, 0x66, 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x52, - 0x65, 0x66, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x52, - 0x65, 0x66, 0x22, 0xb8, 0x01, 0x0a, 0x10, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x4b, 0x0a, 0x08, 0x6d, 0x6c, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x73, 0x65, 0x6c, 0x64, - 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, - 0x65, 0x72, 0x2e, 0x4d, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x65, 0x6c, - 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x48, 0x00, 0x52, 0x08, 0x6d, 0x6c, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x12, 0x43, 0x0a, 0x06, 0x74, 0x72, 0x69, 0x74, 0x6f, 0x6e, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, + 0x04, 0x52, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x45, 0x0a, 0x0a, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x25, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, + 0x65, 0x72, 0x73, 0x12, 0x59, 0x0a, 0x10, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, + 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x48, 0x05, 0x52, 0x10, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x88, 0x01, 0x01, 0x12, 0x45, + 0x0a, 0x09, 0x65, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x25, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x6c, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x48, 0x00, 0x52, 0x09, 0x65, 0x78, 0x70, 0x6c, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x33, 0x0a, 0x03, 0x6c, 0x6c, 0x6d, 0x18, 0x0a, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, + 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x4c, 0x6c, 0x6d, 0x53, + 0x70, 0x65, 0x63, 0x48, 0x00, 0x52, 0x03, 0x6c, 0x6c, 0x6d, 0x42, 0x0c, 0x0a, 0x0a, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x61, 0x72, 0x74, + 0x69, 0x66, 0x61, 0x63, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x10, 0x0a, 0x0e, + 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x0e, + 0x0a, 0x0c, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x42, 0x79, 0x74, 0x65, 0x73, 0x42, 0x09, + 0x0a, 0x07, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x39, + 0x0a, 0x0d, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x88, 0x01, 0x0a, 0x0d, 0x45, 0x78, + 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x12, 0x12, 0x0a, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, + 0x1f, 0x0a, 0x08, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x00, 0x52, 0x08, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x66, 0x88, 0x01, 0x01, + 0x12, 0x25, 0x0a, 0x0b, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x66, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0b, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, + 0x65, 0x52, 0x65, 0x66, 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x52, 0x65, 0x66, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, + 0x65, 0x52, 0x65, 0x66, 0x22, 0x6e, 0x0a, 0x07, 0x4c, 0x6c, 0x6d, 0x53, 0x70, 0x65, 0x63, 0x12, + 0x1f, 0x0a, 0x08, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x66, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x00, 0x52, 0x08, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x66, 0x88, 0x01, 0x01, + 0x12, 0x25, 0x0a, 0x0b, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x66, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0b, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, + 0x65, 0x52, 0x65, 0x66, 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x52, 0x65, 0x66, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, + 0x65, 0x52, 0x65, 0x66, 0x22, 0xb8, 0x01, 0x0a, 0x10, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x4b, 0x0a, 0x08, 0x6d, 0x6c, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x73, 0x65, + 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, + 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x4d, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4d, 0x6f, 0x64, + 0x65, 0x6c, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x48, 0x00, 0x52, 0x08, 0x6d, 0x6c, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x43, 0x0a, 0x06, 0x74, 0x72, 0x69, 0x74, 0x6f, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, + 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, + 0x54, 0x72, 0x69, 0x74, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x48, 0x00, 0x52, 0x06, 0x74, 0x72, 0x69, 0x74, 0x6f, 0x6e, 0x42, 0x12, 0x0a, 0x10, 0x6d, + 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, + 0x41, 0x0a, 0x15, 0x4d, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x65, 0x6c, + 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x61, 0x72, 0x61, + 0x6c, 0x6c, 0x65, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x0f, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x65, + 0x72, 0x73, 0x22, 0x48, 0x0a, 0x11, 0x54, 0x72, 0x69, 0x74, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, + 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x33, 0x0a, 0x03, 0x63, 0x70, 0x75, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x54, 0x72, - 0x69, 0x74, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, - 0x00, 0x52, 0x06, 0x74, 0x72, 0x69, 0x74, 0x6f, 0x6e, 0x42, 0x12, 0x0a, 0x10, 0x6d, 0x6f, 0x64, - 0x65, 0x6c, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x41, 0x0a, - 0x15, 0x4d, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x53, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, - 0x65, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x0f, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, - 0x22, 0x48, 0x0a, 0x11, 0x54, 0x72, 0x69, 0x74, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x33, 0x0a, 0x03, 0x63, 0x70, 0x75, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, - 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x54, 0x72, 0x69, 0x74, - 0x6f, 0x6e, 0x43, 0x50, 0x55, 0x52, 0x03, 0x63, 0x70, 0x75, 0x22, 0x31, 0x0a, 0x09, 0x54, 0x72, - 0x69, 0x74, 0x6f, 0x6e, 0x43, 0x50, 0x55, 0x12, 0x24, 0x0a, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x63, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, - 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x4e, 0x0a, - 0x0e, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x12, - 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1e, 0x0a, - 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, - 0x0a, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x70, 0x65, 0x63, 0x12, 0x1e, 0x0a, 0x0a, 0x69, - 0x6e, 0x70, 0x75, 0x74, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x12, 0x20, 0x0a, 0x0b, 0x6f, - 0x75, 0x74, 0x70, 0x75, 0x74, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x22, 0x7d, 0x0a, - 0x0d, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2e, - 0x0a, 0x11, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x11, 0x73, 0x74, 0x6f, - 0x72, 0x61, 0x67, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x32, - 0x0a, 0x13, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x63, 0x6c, 0x6f, 0x6e, 0x65, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x13, 0x73, - 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x63, 0x6c, 0x6f, 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x42, 0x08, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x13, 0x0a, 0x11, - 0x4c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x4f, 0x0a, 0x0e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x00, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x22, 0xba, 0x01, 0x0a, 0x12, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, - 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x05, 0x6d, 0x6f, 0x64, - 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, + 0x69, 0x74, 0x6f, 0x6e, 0x43, 0x50, 0x55, 0x52, 0x03, 0x63, 0x70, 0x75, 0x22, 0x31, 0x0a, 0x09, + 0x54, 0x72, 0x69, 0x74, 0x6f, 0x6e, 0x43, 0x50, 0x55, 0x12, 0x24, 0x0a, 0x0d, 0x69, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x0d, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, + 0x4e, 0x0a, 0x0e, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x4d, 0x65, 0x74, + 0x61, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, + 0x1e, 0x0a, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x4e, 0x0a, 0x0a, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x53, 0x70, 0x65, 0x63, 0x12, 0x1e, 0x0a, + 0x0a, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x12, 0x20, 0x0a, + 0x0b, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x54, 0x6f, 0x70, 0x69, 0x63, 0x22, + 0x7d, 0x0a, 0x0d, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x12, 0x2e, 0x0a, 0x11, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, + 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x11, 0x73, + 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x32, 0x0a, 0x13, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x63, 0x6c, 0x6f, 0x6e, + 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, + 0x13, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x52, 0x63, 0x6c, 0x6f, 0x6e, 0x65, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x42, 0x08, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x13, + 0x0a, 0x11, 0x4c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x4f, 0x0a, 0x0e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x07, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x00, 0x52, 0x07, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xba, 0x01, 0x0a, 0x12, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x4d, + 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x05, 0x6d, + 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x73, 0x65, 0x6c, + 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, + 0x6c, 0x65, 0x72, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x52, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x53, 0x0a, 0x0e, 0x6b, 0x75, 0x62, + 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x26, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x72, + 0x6e, 0x65, 0x74, 0x65, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x48, 0x00, 0x52, 0x0e, 0x6b, 0x75, 0x62, + 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x88, 0x01, 0x01, 0x42, 0x11, + 0x0a, 0x0f, 0x5f, 0x6b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x4d, 0x65, 0x74, + 0x61, 0x22, 0x15, 0x0a, 0x13, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x6c, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x95, 0x01, 0x0a, 0x13, 0x4d, 0x6f, 0x64, + 0x65, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x1c, 0x0a, 0x09, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x46, + 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x2a, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x08, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, + 0x22, 0xa4, 0x04, 0x0a, 0x12, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x53, 0x0a, 0x0e, 0x6b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x4d, + 0x65, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x73, 0x65, 0x6c, 0x64, + 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, + 0x65, 0x72, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x4d, 0x65, 0x74, + 0x61, 0x48, 0x00, 0x52, 0x0e, 0x6b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x4d, + 0x65, 0x74, 0x61, 0x88, 0x01, 0x01, 0x12, 0x6f, 0x0a, 0x11, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x52, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x41, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x4d, 0x6f, + 0x64, 0x65, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x39, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, + 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, + 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x05, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x40, 0x0a, 0x09, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x44, 0x65, 0x66, 0x6e, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, + 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x4d, + 0x6f, 0x64, 0x65, 0x6c, 0x48, 0x01, 0x52, 0x09, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x44, 0x65, 0x66, + 0x6e, 0x88, 0x01, 0x01, 0x1a, 0x70, 0x0a, 0x16, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x40, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x2a, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, + 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x6b, 0x75, 0x62, 0x65, 0x72, + 0x6e, 0x65, 0x74, 0x65, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x44, 0x65, 0x66, 0x6e, 0x22, 0xd3, 0x03, 0x0a, 0x0b, 0x4d, 0x6f, 0x64, 0x65, + 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x44, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2e, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, + 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, + 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x4d, 0x6f, 0x64, 0x65, + 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x0a, + 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, + 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x2c, 0x0a, 0x11, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x11, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x75, 0x6e, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x13, 0x75, 0x6e, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, 0x4c, 0x0a, 0x13, 0x6c, 0x61, 0x73, 0x74, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x13, + 0x6c, 0x61, 0x73, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x22, 0xb7, 0x01, 0x0a, 0x0a, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x15, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x4d, 0x6f, 0x64, + 0x65, 0x6c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x10, 0x01, 0x12, + 0x12, 0x0a, 0x0e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x46, 0x61, 0x69, 0x6c, + 0x65, 0x64, 0x10, 0x03, 0x12, 0x14, 0x0a, 0x10, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x54, 0x65, 0x72, + 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x10, 0x04, 0x12, 0x13, 0x0a, 0x0f, 0x4d, 0x6f, + 0x64, 0x65, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x10, 0x05, 0x12, + 0x18, 0x0a, 0x14, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, + 0x65, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x10, 0x06, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x63, 0x68, + 0x65, 0x64, 0x75, 0x6c, 0x65, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x10, 0x07, 0x22, 0xd0, 0x03, + 0x0a, 0x12, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x52, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x3c, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, + 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x4d, 0x6f, 0x64, + 0x65, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, + 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, + 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, + 0x12, 0x4c, 0x0a, 0x13, 0x6c, 0x61, 0x73, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x13, 0x6c, 0x61, 0x73, 0x74, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xff, + 0x01, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, + 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x4c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x65, 0x64, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x4c, 0x6f, 0x61, 0x64, 0x69, 0x6e, 0x67, + 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x4c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x10, 0x03, 0x12, 0x0e, + 0x0a, 0x0a, 0x4c, 0x6f, 0x61, 0x64, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x10, 0x04, 0x12, 0x13, + 0x0a, 0x0f, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, + 0x64, 0x10, 0x05, 0x12, 0x0d, 0x0a, 0x09, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x69, 0x6e, 0x67, + 0x10, 0x06, 0x12, 0x0c, 0x0a, 0x08, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x10, 0x07, + 0x12, 0x10, 0x0a, 0x0c, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, + 0x10, 0x08, 0x12, 0x0d, 0x0a, 0x09, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x10, + 0x09, 0x12, 0x15, 0x0a, 0x11, 0x4c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x55, 0x6e, 0x61, 0x76, 0x61, + 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x10, 0x0a, 0x12, 0x18, 0x0a, 0x14, 0x55, 0x6e, 0x6c, 0x6f, + 0x61, 0x64, 0x45, 0x6e, 0x76, 0x6f, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, + 0x10, 0x0b, 0x12, 0x0c, 0x0a, 0x08, 0x44, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x10, 0x0c, + 0x22, 0x5f, 0x0a, 0x13, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x73, 0x75, 0x62, 0x73, 0x63, + 0x72, 0x69, 0x62, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x22, 0xb3, 0x04, 0x0a, 0x14, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x45, 0x0a, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x31, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, - 0x72, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x52, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x53, 0x0a, 0x0e, 0x6b, 0x75, 0x62, 0x65, 0x72, - 0x6e, 0x65, 0x74, 0x65, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x26, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, - 0x74, 0x65, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x48, 0x00, 0x52, 0x0e, 0x6b, 0x75, 0x62, 0x65, 0x72, - 0x6e, 0x65, 0x74, 0x65, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x88, 0x01, 0x01, 0x42, 0x11, 0x0a, 0x0f, - 0x5f, 0x6b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x22, - 0x15, 0x0a, 0x13, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x95, 0x01, 0x0a, 0x13, 0x4d, 0x6f, 0x64, 0x65, 0x6c, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, - 0x0a, 0x09, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x46, 0x0a, 0x08, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, - 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x08, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x22, 0xa4, - 0x04, 0x0a, 0x12, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, - 0x1e, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x72, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x4c, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, + 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x73, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, + 0x2a, 0x0a, 0x10, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x65, 0x78, 0x70, 0x65, 0x63, + 0x74, 0x65, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x61, + 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, 0x36, 0x0a, 0x16, 0x6e, 0x75, 0x6d, + 0x4c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x16, 0x6e, 0x75, 0x6d, 0x4c, 0x6f, + 0x61, 0x64, 0x65, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x73, 0x12, 0x53, 0x0a, 0x0e, 0x6b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x4d, + 0x65, 0x74, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x73, 0x65, 0x6c, 0x64, + 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, + 0x65, 0x72, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x4d, 0x65, 0x74, + 0x61, 0x48, 0x00, 0x52, 0x0e, 0x6b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x4d, + 0x65, 0x74, 0x61, 0x88, 0x01, 0x01, 0x22, 0x6c, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1d, + 0x0a, 0x19, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x54, 0x79, 0x70, 0x65, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x10, 0x0a, + 0x0c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x10, 0x01, 0x12, + 0x1f, 0x0a, 0x1b, 0x4e, 0x6f, 0x6e, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x61, 0x74, + 0x69, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x49, 0x6e, 0x66, 0x6f, 0x10, 0x02, + 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x10, 0x04, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x6b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, + 0x74, 0x65, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x22, 0xf6, 0x01, 0x0a, 0x16, 0x53, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x49, 0x64, 0x78, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x49, + 0x64, 0x78, 0x12, 0x2a, 0x0a, 0x10, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x4d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x42, 0x79, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x74, 0x6f, + 0x74, 0x61, 0x6c, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x32, + 0x0a, 0x14, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x42, 0x79, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x14, 0x61, 0x76, + 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x42, 0x79, 0x74, + 0x65, 0x73, 0x12, 0x28, 0x0a, 0x0f, 0x6e, 0x75, 0x6d, 0x4c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x4d, + 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x6e, 0x75, 0x6d, + 0x4c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x14, + 0x6f, 0x76, 0x65, 0x72, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, + 0x74, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x14, 0x6f, 0x76, 0x65, 0x72, + 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, + 0x22, 0x42, 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0e, + 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x72, + 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xab, 0x01, 0x0a, 0x12, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x73, + 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x72, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x41, 0x0a, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, + 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x4d, 0x6f, 0x64, 0x65, + 0x6c, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x48, 0x00, 0x52, 0x05, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x6c, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x6d, 0x6f, 0x64, + 0x65, 0x6c, 0x22, 0x77, 0x0a, 0x13, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, + 0x66, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x07, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x73, 0x65, 0x6c, + 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, + 0x6c, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, + 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x73, 0x46, + 0x69, 0x72, 0x73, 0x74, 0x53, 0x79, 0x6e, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, + 0x69, 0x73, 0x46, 0x69, 0x72, 0x73, 0x74, 0x53, 0x79, 0x6e, 0x63, 0x22, 0x92, 0x02, 0x0a, 0x0c, + 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x2a, 0x0a, 0x10, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x52, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x65, 0x78, 0x70, 0x65, + 0x63, 0x74, 0x65, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, 0x20, 0x0a, 0x0b, + 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x0b, 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, 0x20, + 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, + 0x12, 0x16, 0x0a, 0x06, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x06, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x12, 0x53, 0x0a, 0x0e, 0x6b, 0x75, 0x62, 0x65, + 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x26, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, + 0x65, 0x74, 0x65, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x48, 0x00, 0x52, 0x0e, 0x6b, 0x75, 0x62, 0x65, + 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x88, 0x01, 0x01, 0x42, 0x11, 0x0a, + 0x0f, 0x5f, 0x6b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x4d, 0x65, 0x74, 0x61, + 0x22, 0x16, 0x0a, 0x14, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x43, 0x0a, 0x19, 0x53, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, + 0x62, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, + 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x5c, 0x0a, + 0x16, 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x42, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x65, 0x72, + 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x73, 0x65, + 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, + 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x0a, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0xee, 0x03, 0x0a, 0x0a, + 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, + 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x00, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, + 0x0a, 0x63, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x2b, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x65, 0x72, + 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x0a, + 0x63, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, 0x12, 0x45, 0x0a, 0x06, 0x6d, 0x69, + 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x73, 0x65, 0x6c, + 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, + 0x6c, 0x65, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x69, + 0x72, 0x72, 0x6f, 0x72, 0x48, 0x01, 0x52, 0x06, 0x6d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x88, 0x01, + 0x01, 0x12, 0x45, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x28, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x65, 0x72, + 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x02, 0x52, 0x06, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x88, 0x01, 0x01, 0x12, 0x53, 0x0a, 0x0e, 0x6b, 0x75, 0x62, 0x65, + 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x26, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, + 0x65, 0x74, 0x65, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x48, 0x03, 0x52, 0x0e, 0x6b, 0x75, 0x62, 0x65, + 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x88, 0x01, 0x01, 0x12, 0x48, 0x0a, + 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, + 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x6d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x42, 0x09, + 0x0a, 0x07, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x6b, 0x75, + 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x22, 0x3a, 0x0a, 0x10, + 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x12, 0x26, 0x0a, 0x0e, 0x73, 0x74, 0x69, 0x63, 0x6b, 0x79, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x73, 0x74, 0x69, 0x63, 0x6b, 0x79, + 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x41, 0x0a, 0x13, 0x45, 0x78, 0x70, 0x65, + 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x06, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0x40, 0x0a, 0x10, 0x45, + 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x22, 0x19, 0x0a, + 0x17, 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x0a, 0x15, 0x53, 0x74, 0x6f, 0x70, + 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x18, 0x0a, 0x16, 0x53, 0x74, 0x6f, 0x70, 0x45, 0x78, 0x70, + 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x47, 0x0a, 0x1d, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x75, 0x62, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x26, 0x0a, 0x0e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x72, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, + 0x69, 0x62, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xbc, 0x02, 0x0a, 0x18, 0x45, 0x78, 0x70, + 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, + 0x65, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x65, + 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, + 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, + 0x74, 0x65, 0x73, 0x52, 0x65, 0x61, 0x64, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, + 0x63, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x61, 0x64, 0x79, 0x12, + 0x20, 0x0a, 0x0b, 0x6d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x65, 0x61, 0x64, 0x79, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x6d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x65, 0x61, 0x64, + 0x79, 0x12, 0x2c, 0x0a, 0x11, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x44, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x53, 0x0a, 0x0e, 0x6b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x4d, 0x65, 0x74, - 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, + 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x48, 0x00, 0x52, 0x0e, 0x6b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x4d, 0x65, 0x74, - 0x61, 0x88, 0x01, 0x01, 0x12, 0x6f, 0x0a, 0x11, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x70, - 0x6c, 0x69, 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x41, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x4d, 0x6f, 0x64, 0x65, - 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x11, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x39, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, - 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x4d, 0x6f, - 0x64, 0x65, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x12, 0x40, 0x0a, 0x09, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x44, 0x65, 0x66, 0x6e, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, - 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x4d, 0x6f, 0x64, - 0x65, 0x6c, 0x48, 0x01, 0x52, 0x09, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x44, 0x65, 0x66, 0x6e, 0x88, - 0x01, 0x01, 0x1a, 0x70, 0x0a, 0x16, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x40, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, + 0x61, 0x88, 0x01, 0x01, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x6b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, + 0x74, 0x65, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x22, 0x53, 0x0a, 0x13, 0x4c, 0x6f, 0x61, 0x64, 0x50, + 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3c, + 0x0a, 0x08, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x20, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, + 0x6e, 0x65, 0x52, 0x08, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x22, 0x63, 0x0a, 0x17, + 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x73, 0x75, 0x62, 0x73, 0x63, + 0x72, 0x69, 0x62, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x22, 0x8a, 0x03, 0x0a, 0x08, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x75, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x3a, + 0x0a, 0x05, 0x73, 0x74, 0x65, 0x70, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, - 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x6b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, - 0x74, 0x65, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x6d, 0x6f, 0x64, 0x65, - 0x6c, 0x44, 0x65, 0x66, 0x6e, 0x22, 0xd3, 0x03, 0x0a, 0x0b, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x44, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2e, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, - 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x4d, 0x6f, - 0x64, 0x65, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, - 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, - 0x73, 0x6f, 0x6e, 0x12, 0x2c, 0x0a, 0x11, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, - 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x73, 0x12, 0x30, 0x0a, 0x13, 0x75, 0x6e, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, - 0x75, 0x6e, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x73, 0x12, 0x4c, 0x0a, 0x13, 0x6c, 0x61, 0x73, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x13, 0x6c, 0x61, - 0x73, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x22, 0xb7, 0x01, 0x0a, 0x0a, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x12, 0x15, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x55, 0x6e, - 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x4d, 0x6f, 0x64, 0x65, 0x6c, - 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x10, 0x01, 0x12, 0x12, 0x0a, - 0x0e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x10, - 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, - 0x10, 0x03, 0x12, 0x14, 0x0a, 0x10, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x69, - 0x6e, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x10, 0x04, 0x12, 0x13, 0x0a, 0x0f, 0x4d, 0x6f, 0x64, 0x65, - 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x10, 0x05, 0x12, 0x18, 0x0a, - 0x14, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x46, - 0x61, 0x69, 0x6c, 0x65, 0x64, 0x10, 0x06, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x63, 0x68, 0x65, 0x64, - 0x75, 0x6c, 0x65, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x10, 0x07, 0x22, 0xd0, 0x03, 0x0a, 0x12, - 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x52, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x3c, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, - 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x4d, 0x6f, - 0x64, 0x65, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, - 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x4c, - 0x0a, 0x13, 0x6c, 0x61, 0x73, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x13, 0x6c, 0x61, 0x73, 0x74, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xff, 0x01, 0x0a, - 0x11, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x53, 0x74, 0x61, 0x74, 0x65, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, - 0x12, 0x11, 0x0a, 0x0d, 0x4c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, - 0x64, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x4c, 0x6f, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x10, 0x02, - 0x12, 0x0a, 0x0a, 0x06, 0x4c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x10, 0x03, 0x12, 0x0e, 0x0a, 0x0a, - 0x4c, 0x6f, 0x61, 0x64, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x10, 0x04, 0x12, 0x13, 0x0a, 0x0f, - 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x10, - 0x05, 0x12, 0x0d, 0x0a, 0x09, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x10, 0x06, - 0x12, 0x0c, 0x0a, 0x08, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x10, 0x07, 0x12, 0x10, - 0x0a, 0x0c, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x10, 0x08, - 0x12, 0x0d, 0x0a, 0x09, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x10, 0x09, 0x12, - 0x15, 0x0a, 0x11, 0x4c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x55, 0x6e, 0x61, 0x76, 0x61, 0x69, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x10, 0x0a, 0x12, 0x18, 0x0a, 0x14, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, - 0x45, 0x6e, 0x76, 0x6f, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x10, 0x0b, - 0x12, 0x0c, 0x0a, 0x08, 0x44, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x10, 0x0c, 0x22, 0x5f, - 0x0a, 0x13, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, - 0x62, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, - 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x17, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22, - 0xb3, 0x04, 0x0a, 0x14, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x45, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x31, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, - 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, - 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, - 0x1e, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x4c, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, - 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x73, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x2a, 0x0a, - 0x10, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, - 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x61, 0x76, 0x61, - 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x52, - 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, 0x36, 0x0a, 0x16, 0x6e, 0x75, 0x6d, 0x4c, 0x6f, - 0x61, 0x64, 0x65, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x16, 0x6e, 0x75, 0x6d, 0x4c, 0x6f, 0x61, 0x64, - 0x65, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, + 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, + 0x74, 0x65, 0x70, 0x52, 0x05, 0x73, 0x74, 0x65, 0x70, 0x73, 0x12, 0x43, 0x0a, 0x06, 0x6f, 0x75, + 0x74, 0x70, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x73, 0x65, 0x6c, + 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, + 0x6c, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x4f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x48, 0x00, 0x52, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x88, 0x01, 0x01, 0x12, 0x53, 0x0a, 0x0e, 0x6b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x48, - 0x00, 0x52, 0x0e, 0x6b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x4d, 0x65, 0x74, - 0x61, 0x88, 0x01, 0x01, 0x22, 0x6c, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1d, 0x0a, 0x19, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x54, 0x79, - 0x70, 0x65, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x10, 0x01, 0x12, 0x1f, 0x0a, - 0x1b, 0x4e, 0x6f, 0x6e, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x61, 0x74, 0x69, 0x76, - 0x65, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x49, 0x6e, 0x66, 0x6f, 0x10, 0x02, 0x12, 0x12, - 0x0a, 0x0e, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x10, 0x04, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x6b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, - 0x73, 0x4d, 0x65, 0x74, 0x61, 0x22, 0xf6, 0x01, 0x0a, 0x16, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, - 0x12, 0x1e, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x49, 0x64, 0x78, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x49, 0x64, 0x78, - 0x12, 0x2a, 0x0a, 0x10, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x42, - 0x79, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x74, 0x6f, 0x74, 0x61, - 0x6c, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x14, - 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x42, - 0x79, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x14, 0x61, 0x76, 0x61, 0x69, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x42, 0x79, 0x74, 0x65, 0x73, - 0x12, 0x28, 0x0a, 0x0f, 0x6e, 0x75, 0x6d, 0x4c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x4d, 0x6f, 0x64, - 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x6e, 0x75, 0x6d, 0x4c, 0x6f, - 0x61, 0x64, 0x65, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x14, 0x6f, 0x76, - 0x65, 0x72, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, - 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x14, 0x6f, 0x76, 0x65, 0x72, 0x43, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x22, 0x42, - 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x73, 0x75, - 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x72, 0x4e, 0x61, - 0x6d, 0x65, 0x22, 0xab, 0x01, 0x0a, 0x12, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x73, 0x75, 0x62, - 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x72, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x41, 0x0a, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x26, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, - 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x48, 0x00, 0x52, 0x05, 0x6d, 0x6f, 0x64, 0x65, - 0x6c, 0x88, 0x01, 0x01, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, - 0x22, 0x77, 0x0a, 0x13, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, - 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, - 0x72, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x52, 0x07, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x73, 0x46, 0x69, 0x72, - 0x73, 0x74, 0x53, 0x79, 0x6e, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, - 0x46, 0x69, 0x72, 0x73, 0x74, 0x53, 0x79, 0x6e, 0x63, 0x22, 0x92, 0x02, 0x0a, 0x0c, 0x53, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2a, - 0x0a, 0x10, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, - 0x65, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x6d, 0x69, - 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x0b, 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, 0x20, 0x0a, 0x0b, - 0x6d, 0x61, 0x78, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, 0x16, - 0x0a, 0x06, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, - 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x12, 0x53, 0x0a, 0x0e, 0x6b, 0x75, 0x62, 0x65, 0x72, 0x6e, - 0x65, 0x74, 0x65, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, - 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, - 0x65, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x48, 0x00, 0x52, 0x0e, 0x6b, 0x75, 0x62, 0x65, 0x72, 0x6e, - 0x65, 0x74, 0x65, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x88, 0x01, 0x01, 0x42, 0x11, 0x0a, 0x0f, 0x5f, - 0x6b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x22, 0x16, - 0x0a, 0x14, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x43, 0x0a, 0x19, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, - 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x75, 0x62, - 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x5c, 0x0a, 0x16, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x42, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, - 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x73, 0x65, 0x6c, 0x64, - 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, - 0x65, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x65, - 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0xee, 0x03, 0x0a, 0x0a, 0x45, 0x78, - 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x07, - 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, - 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a, 0x0a, 0x63, - 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x2b, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, - 0x65, 0x6e, 0x74, 0x43, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x52, 0x0a, 0x63, 0x61, - 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, 0x12, 0x45, 0x0a, 0x06, 0x6d, 0x69, 0x72, 0x72, - 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, + 0x01, 0x52, 0x0e, 0x6b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x4d, 0x65, 0x74, + 0x61, 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, 0x05, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, + 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, + 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x48, 0x02, 0x52, 0x05, 0x69, 0x6e, + 0x70, 0x75, 0x74, 0x88, 0x01, 0x01, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, + 0x74, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x6b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, + 0x4d, 0x65, 0x74, 0x61, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x22, 0x9d, + 0x04, 0x0a, 0x0c, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x65, 0x70, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x06, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x12, 0x27, 0x0a, 0x0c, 0x6a, + 0x6f, 0x69, 0x6e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4d, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0d, 0x48, 0x00, 0x52, 0x0c, 0x6a, 0x6f, 0x69, 0x6e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4d, + 0x73, 0x88, 0x01, 0x01, 0x12, 0x51, 0x0a, 0x09, 0x74, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x4d, 0x61, + 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, + 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, + 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x65, 0x70, 0x2e, 0x54, 0x65, + 0x6e, 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x74, 0x65, + 0x6e, 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x4b, 0x0a, 0x0a, 0x69, 0x6e, 0x70, 0x75, 0x74, + 0x73, 0x4a, 0x6f, 0x69, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x73, 0x65, + 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, + 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x65, + 0x70, 0x2e, 0x4a, 0x6f, 0x69, 0x6e, 0x4f, 0x70, 0x52, 0x0a, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, + 0x4a, 0x6f, 0x69, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, + 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, + 0x12, 0x4f, 0x0a, 0x0c, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x4a, 0x6f, 0x69, 0x6e, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, + 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, + 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x65, 0x70, 0x2e, 0x4a, 0x6f, 0x69, + 0x6e, 0x4f, 0x70, 0x52, 0x0c, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x4a, 0x6f, 0x69, + 0x6e, 0x12, 0x33, 0x0a, 0x05, 0x62, 0x61, 0x74, 0x63, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, + 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, + 0x05, 0x62, 0x61, 0x74, 0x63, 0x68, 0x1a, 0x3c, 0x0a, 0x0e, 0x54, 0x65, 0x6e, 0x73, 0x6f, 0x72, + 0x4d, 0x61, 0x70, 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, 0x22, 0x27, 0x0a, 0x06, 0x4a, 0x6f, 0x69, 0x6e, 0x4f, 0x70, 0x12, 0x09, + 0x0a, 0x05, 0x49, 0x4e, 0x4e, 0x45, 0x52, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x4f, 0x55, 0x54, + 0x45, 0x52, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4e, 0x59, 0x10, 0x02, 0x42, 0x0f, 0x0a, + 0x0d, 0x5f, 0x6a, 0x6f, 0x69, 0x6e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4d, 0x73, 0x22, 0x57, + 0x0a, 0x05, 0x42, 0x61, 0x74, 0x63, 0x68, 0x12, 0x17, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x00, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x88, 0x01, 0x01, + 0x12, 0x1f, 0x0a, 0x08, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4d, 0x73, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0d, 0x48, 0x01, 0x52, 0x08, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4d, 0x73, 0x88, 0x01, + 0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x77, + 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4d, 0x73, 0x22, 0xf4, 0x03, 0x0a, 0x0d, 0x50, 0x69, 0x70, 0x65, + 0x6c, 0x69, 0x6e, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x65, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x0e, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, + 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x54, 0x72, 0x69, + 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x65, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, 0x27, 0x0a, + 0x0c, 0x6a, 0x6f, 0x69, 0x6e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4d, 0x73, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0d, 0x48, 0x00, 0x52, 0x0c, 0x6a, 0x6f, 0x69, 0x6e, 0x57, 0x69, 0x6e, 0x64, 0x6f, + 0x77, 0x4d, 0x73, 0x88, 0x01, 0x01, 0x12, 0x48, 0x0a, 0x08, 0x6a, 0x6f, 0x69, 0x6e, 0x54, 0x79, + 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, - 0x72, 0x2e, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x69, 0x72, 0x72, - 0x6f, 0x72, 0x48, 0x01, 0x52, 0x06, 0x6d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x88, 0x01, 0x01, 0x12, - 0x45, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x28, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, - 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x02, 0x52, 0x06, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x88, 0x01, 0x01, 0x12, 0x53, 0x0a, 0x0e, 0x6b, 0x75, 0x62, 0x65, 0x72, 0x6e, - 0x65, 0x74, 0x65, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, + 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2e, + 0x4a, 0x6f, 0x69, 0x6e, 0x4f, 0x70, 0x52, 0x08, 0x6a, 0x6f, 0x69, 0x6e, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x50, 0x0a, 0x0c, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x4a, 0x6f, 0x69, 0x6e, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, + 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, + 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2e, 0x4a, 0x6f, + 0x69, 0x6e, 0x4f, 0x70, 0x52, 0x0c, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x4a, 0x6f, + 0x69, 0x6e, 0x12, 0x52, 0x0a, 0x09, 0x74, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x70, 0x18, + 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, + 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x50, + 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2e, 0x54, 0x65, 0x6e, + 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x74, 0x65, 0x6e, + 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x70, 0x1a, 0x3c, 0x0a, 0x0e, 0x54, 0x65, 0x6e, 0x73, 0x6f, 0x72, + 0x4d, 0x61, 0x70, 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, 0x22, 0x27, 0x0a, 0x06, 0x4a, 0x6f, 0x69, 0x6e, 0x4f, 0x70, 0x12, 0x09, + 0x0a, 0x05, 0x49, 0x4e, 0x4e, 0x45, 0x52, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x4f, 0x55, 0x54, + 0x45, 0x52, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4e, 0x59, 0x10, 0x02, 0x42, 0x0f, 0x0a, + 0x0d, 0x5f, 0x6a, 0x6f, 0x69, 0x6e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4d, 0x73, 0x22, 0xd3, + 0x02, 0x0a, 0x0e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x4f, 0x75, 0x74, 0x70, 0x75, + 0x74, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x65, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x05, 0x73, 0x74, 0x65, 0x70, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x6a, 0x6f, 0x69, 0x6e, 0x57, + 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6a, + 0x6f, 0x69, 0x6e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4d, 0x73, 0x12, 0x4b, 0x0a, 0x09, 0x73, + 0x74, 0x65, 0x70, 0x73, 0x4a, 0x6f, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, - 0x65, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x48, 0x03, 0x52, 0x0e, 0x6b, 0x75, 0x62, 0x65, 0x72, 0x6e, - 0x65, 0x74, 0x65, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x88, 0x01, 0x01, 0x12, 0x48, 0x0a, 0x0c, 0x72, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x24, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x54, 0x79, 0x70, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x6d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x42, 0x09, 0x0a, 0x07, - 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x6b, 0x75, 0x62, 0x65, - 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x22, 0x3a, 0x0a, 0x10, 0x45, 0x78, - 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x26, - 0x0a, 0x0e, 0x73, 0x74, 0x69, 0x63, 0x6b, 0x79, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x73, 0x74, 0x69, 0x63, 0x6b, 0x79, 0x53, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x41, 0x0a, 0x13, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, - 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x16, 0x0a, 0x06, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x06, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0x40, 0x0a, 0x10, 0x45, 0x78, 0x70, - 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x07, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x22, 0x19, 0x0a, 0x17, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x0a, 0x15, 0x53, 0x74, 0x6f, 0x70, 0x45, 0x78, - 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x22, 0x18, 0x0a, 0x16, 0x53, 0x74, 0x6f, 0x70, 0x45, 0x78, 0x70, 0x65, 0x72, - 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x47, 0x0a, - 0x1d, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x75, 0x62, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, - 0x0a, 0x0e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, - 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xbc, 0x02, 0x0a, 0x18, 0x45, 0x78, 0x70, 0x65, 0x72, - 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, - 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x65, 0x78, 0x70, - 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x61, - 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, - 0x73, 0x52, 0x65, 0x61, 0x64, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x63, 0x61, - 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x61, 0x64, 0x79, 0x12, 0x20, 0x0a, - 0x0b, 0x6d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x65, 0x61, 0x64, 0x79, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0b, 0x6d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x65, 0x61, 0x64, 0x79, 0x12, - 0x2c, 0x0a, 0x11, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x53, 0x0a, - 0x0e, 0x6b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, - 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x4b, - 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x48, 0x00, 0x52, - 0x0e, 0x6b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x88, - 0x01, 0x01, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x6b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, - 0x73, 0x4d, 0x65, 0x74, 0x61, 0x22, 0x53, 0x0a, 0x13, 0x4c, 0x6f, 0x61, 0x64, 0x50, 0x69, 0x70, - 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x08, + 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, + 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x2e, 0x4a, 0x6f, 0x69, 0x6e, 0x4f, 0x70, 0x52, 0x09, 0x73, + 0x74, 0x65, 0x70, 0x73, 0x4a, 0x6f, 0x69, 0x6e, 0x12, 0x53, 0x0a, 0x09, 0x74, 0x65, 0x6e, 0x73, + 0x6f, 0x72, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x73, 0x65, + 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, + 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x4f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x2e, 0x54, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x09, 0x74, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x70, 0x1a, 0x3c, 0x0a, + 0x0e, 0x54, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x70, 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, 0x22, 0x27, 0x0a, 0x06, 0x4a, + 0x6f, 0x69, 0x6e, 0x4f, 0x70, 0x12, 0x09, 0x0a, 0x05, 0x49, 0x4e, 0x4e, 0x45, 0x52, 0x10, 0x00, + 0x12, 0x09, 0x0a, 0x05, 0x4f, 0x55, 0x54, 0x45, 0x52, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x41, + 0x4e, 0x59, 0x10, 0x02, 0x22, 0x16, 0x0a, 0x14, 0x4c, 0x6f, 0x61, 0x64, 0x50, 0x69, 0x70, 0x65, + 0x6c, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x0a, 0x15, + 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x18, 0x0a, 0x16, 0x55, 0x6e, 0x6c, + 0x6f, 0x61, 0x64, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x83, 0x01, 0x0a, 0x15, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, + 0x0e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, + 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x20, + 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x45, 0x0a, 0x1b, 0x50, 0x69, 0x70, + 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x73, 0x75, 0x62, 0x73, + 0x63, 0x72, 0x69, 0x62, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, + 0x22, 0x83, 0x01, 0x0a, 0x16, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x70, + 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x45, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x29, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, + 0x69, 0x6e, 0x65, 0x57, 0x69, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x08, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x95, 0x01, 0x0a, 0x11, 0x50, 0x69, 0x70, 0x65, 0x6c, + 0x69, 0x6e, 0x65, 0x57, 0x69, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3c, 0x0a, 0x08, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, - 0x52, 0x08, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x22, 0x63, 0x0a, 0x17, 0x45, 0x78, - 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, + 0x52, 0x08, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x42, 0x0a, 0x05, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x73, 0x65, 0x6c, 0x64, + 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, + 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0xe4, + 0x03, 0x0a, 0x14, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x69, 0x70, 0x65, 0x6c, + 0x69, 0x6e, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x0f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x53, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x3b, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, + 0x69, 0x6e, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, + 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x4c, + 0x0a, 0x13, 0x6c, 0x61, 0x73, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x13, 0x6c, 0x61, 0x73, 0x74, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x20, 0x0a, 0x0b, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x61, 0x64, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0b, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x61, 0x64, 0x79, 0x22, 0xc4, + 0x01, 0x0a, 0x0e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x19, 0x0a, 0x15, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, + 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x10, 0x01, + 0x12, 0x14, 0x0a, 0x10, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x69, 0x6e, 0x67, 0x10, 0x02, 0x12, 0x11, 0x0a, 0x0d, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, + 0x6e, 0x65, 0x52, 0x65, 0x61, 0x64, 0x79, 0x10, 0x03, 0x12, 0x12, 0x0a, 0x0e, 0x50, 0x69, 0x70, + 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x10, 0x04, 0x12, 0x15, 0x0a, + 0x11, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, + 0x74, 0x65, 0x10, 0x05, 0x12, 0x17, 0x0a, 0x13, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, + 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x10, 0x06, 0x12, 0x16, 0x0a, + 0x12, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, + 0x74, 0x65, 0x64, 0x10, 0x07, 0x22, 0x40, 0x0a, 0x16, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, + 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x26, 0x0a, 0x0e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x72, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, + 0x62, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x49, 0x0a, 0x17, 0x53, 0x63, 0x68, 0x65, 0x64, + 0x75, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x12, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, + 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x22, 0x49, 0x0a, 0x1f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x50, 0x6c, 0x61, + 0x6e, 0x65, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, - 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x17, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22, - 0x8a, 0x03, 0x0a, 0x08, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, - 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x05, - 0x73, 0x74, 0x65, 0x70, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x73, 0x65, - 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, - 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x65, - 0x70, 0x52, 0x05, 0x73, 0x74, 0x65, 0x70, 0x73, 0x12, 0x43, 0x0a, 0x06, 0x6f, 0x75, 0x74, 0x70, - 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, - 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, - 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, - 0x48, 0x00, 0x52, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x88, 0x01, 0x01, 0x12, 0x53, 0x0a, - 0x0e, 0x6b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, - 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x4b, - 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x48, 0x01, 0x52, - 0x0e, 0x6b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x88, - 0x01, 0x01, 0x12, 0x40, 0x0a, 0x05, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x25, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, - 0x69, 0x6e, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x48, 0x02, 0x52, 0x05, 0x69, 0x6e, 0x70, 0x75, - 0x74, 0x88, 0x01, 0x01, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x42, - 0x11, 0x0a, 0x0f, 0x5f, 0x6b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x4d, 0x65, - 0x74, 0x61, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x22, 0x9d, 0x04, 0x0a, - 0x0c, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x65, 0x70, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x06, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x12, 0x27, 0x0a, 0x0c, 0x6a, 0x6f, 0x69, - 0x6e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4d, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x48, - 0x00, 0x52, 0x0c, 0x6a, 0x6f, 0x69, 0x6e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4d, 0x73, 0x88, - 0x01, 0x01, 0x12, 0x51, 0x0a, 0x09, 0x74, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x70, 0x18, - 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, - 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x50, - 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x65, 0x70, 0x2e, 0x54, 0x65, 0x6e, 0x73, - 0x6f, 0x72, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x74, 0x65, 0x6e, 0x73, - 0x6f, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x4b, 0x0a, 0x0a, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x4a, - 0x6f, 0x69, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x73, 0x65, 0x6c, 0x64, + 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xa2, 0x01, + 0x0a, 0x14, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x32, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, + 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x43, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x22, 0x40, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x11, 0x0a, 0x0d, 0x55, 0x4e, 0x4b, + 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, + 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x45, 0x52, 0x53, 0x10, 0x01, 0x12, 0x12, + 0x0a, 0x0e, 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x53, + 0x10, 0x02, 0x2a, 0x27, 0x0a, 0x0c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x09, 0x0a, 0x05, 0x4d, 0x4f, 0x44, 0x45, 0x4c, 0x10, 0x00, 0x12, 0x0c, 0x0a, + 0x08, 0x50, 0x49, 0x50, 0x45, 0x4c, 0x49, 0x4e, 0x45, 0x10, 0x01, 0x32, 0xde, 0x0f, 0x0a, 0x09, + 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x12, 0x6b, 0x0a, 0x0c, 0x53, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x12, 0x2b, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, - 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x65, 0x70, 0x2e, - 0x4a, 0x6f, 0x69, 0x6e, 0x4f, 0x70, 0x52, 0x0a, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x4a, 0x6f, - 0x69, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x18, 0x06, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, 0x4f, - 0x0a, 0x0c, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x4a, 0x6f, 0x69, 0x6e, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, - 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x50, 0x69, - 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x65, 0x70, 0x2e, 0x4a, 0x6f, 0x69, 0x6e, 0x4f, - 0x70, 0x52, 0x0c, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x4a, 0x6f, 0x69, 0x6e, 0x12, - 0x33, 0x0a, 0x05, 0x62, 0x61, 0x74, 0x63, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, - 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, - 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x52, 0x05, 0x62, - 0x61, 0x74, 0x63, 0x68, 0x1a, 0x3c, 0x0a, 0x0e, 0x54, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x4d, 0x61, - 0x70, 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, 0x22, 0x27, 0x0a, 0x06, 0x4a, 0x6f, 0x69, 0x6e, 0x4f, 0x70, 0x12, 0x09, 0x0a, 0x05, - 0x49, 0x4e, 0x4e, 0x45, 0x52, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x4f, 0x55, 0x54, 0x45, 0x52, - 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4e, 0x59, 0x10, 0x02, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, - 0x6a, 0x6f, 0x69, 0x6e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4d, 0x73, 0x22, 0x57, 0x0a, 0x05, - 0x42, 0x61, 0x74, 0x63, 0x68, 0x12, 0x17, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0d, 0x48, 0x00, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x88, 0x01, 0x01, 0x12, 0x1f, - 0x0a, 0x08, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, - 0x48, 0x01, 0x52, 0x08, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4d, 0x73, 0x88, 0x01, 0x01, 0x42, - 0x07, 0x0a, 0x05, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x77, 0x69, 0x6e, - 0x64, 0x6f, 0x77, 0x4d, 0x73, 0x22, 0xf4, 0x03, 0x0a, 0x0d, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, - 0x6e, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x65, 0x78, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x0e, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x12, - 0x2a, 0x0a, 0x10, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x54, 0x72, 0x69, 0x67, 0x67, - 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x65, 0x78, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x12, 0x27, 0x0a, 0x0c, 0x6a, - 0x6f, 0x69, 0x6e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4d, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0d, 0x48, 0x00, 0x52, 0x0c, 0x6a, 0x6f, 0x69, 0x6e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4d, - 0x73, 0x88, 0x01, 0x01, 0x12, 0x48, 0x0a, 0x08, 0x6a, 0x6f, 0x69, 0x6e, 0x54, 0x79, 0x70, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, + 0x65, 0x72, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, - 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2e, 0x4a, 0x6f, - 0x69, 0x6e, 0x4f, 0x70, 0x52, 0x08, 0x6a, 0x6f, 0x69, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x50, - 0x0a, 0x0c, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x4a, 0x6f, 0x69, 0x6e, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, - 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x50, 0x69, - 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2e, 0x4a, 0x6f, 0x69, 0x6e, - 0x4f, 0x70, 0x52, 0x0c, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x73, 0x4a, 0x6f, 0x69, 0x6e, - 0x12, 0x52, 0x0a, 0x09, 0x74, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x70, 0x18, 0x06, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, - 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, - 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2e, 0x54, 0x65, 0x6e, 0x73, 0x6f, - 0x72, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x74, 0x65, 0x6e, 0x73, 0x6f, - 0x72, 0x4d, 0x61, 0x70, 0x1a, 0x3c, 0x0a, 0x0e, 0x54, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x4d, 0x61, - 0x70, 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, 0x22, 0x27, 0x0a, 0x06, 0x4a, 0x6f, 0x69, 0x6e, 0x4f, 0x70, 0x12, 0x09, 0x0a, 0x05, - 0x49, 0x4e, 0x4e, 0x45, 0x52, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x4f, 0x55, 0x54, 0x45, 0x52, - 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4e, 0x59, 0x10, 0x02, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, - 0x6a, 0x6f, 0x69, 0x6e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4d, 0x73, 0x22, 0xd3, 0x02, 0x0a, - 0x0e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, - 0x14, 0x0a, 0x05, 0x73, 0x74, 0x65, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, - 0x73, 0x74, 0x65, 0x70, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x6a, 0x6f, 0x69, 0x6e, 0x57, 0x69, 0x6e, - 0x64, 0x6f, 0x77, 0x4d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6a, 0x6f, 0x69, - 0x6e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x4d, 0x73, 0x12, 0x4b, 0x0a, 0x09, 0x73, 0x74, 0x65, - 0x70, 0x73, 0x4a, 0x6f, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x73, - 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x4f, 0x75, - 0x74, 0x70, 0x75, 0x74, 0x2e, 0x4a, 0x6f, 0x69, 0x6e, 0x4f, 0x70, 0x52, 0x09, 0x73, 0x74, 0x65, - 0x70, 0x73, 0x4a, 0x6f, 0x69, 0x6e, 0x12, 0x53, 0x0a, 0x09, 0x74, 0x65, 0x6e, 0x73, 0x6f, 0x72, - 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x73, 0x65, 0x6c, 0x64, + 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x62, 0x0a, 0x09, 0x4c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, + 0x64, 0x65, 0x6c, 0x12, 0x28, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, + 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x4c, 0x6f, 0x61, + 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, + 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x6c, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x68, 0x0a, 0x0b, 0x55, 0x6e, + 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x2a, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, - 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x4f, 0x75, 0x74, 0x70, 0x75, - 0x74, 0x2e, 0x54, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x09, 0x74, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x70, 0x1a, 0x3c, 0x0a, 0x0e, 0x54, - 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x4d, 0x61, 0x70, 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, 0x22, 0x27, 0x0a, 0x06, 0x4a, 0x6f, 0x69, - 0x6e, 0x4f, 0x70, 0x12, 0x09, 0x0a, 0x05, 0x49, 0x4e, 0x4e, 0x45, 0x52, 0x10, 0x00, 0x12, 0x09, - 0x0a, 0x05, 0x4f, 0x55, 0x54, 0x45, 0x52, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4e, 0x59, - 0x10, 0x02, 0x22, 0x16, 0x0a, 0x14, 0x4c, 0x6f, 0x61, 0x64, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, - 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x0a, 0x15, 0x55, 0x6e, - 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x18, 0x0a, 0x16, 0x55, 0x6e, 0x6c, 0x6f, 0x61, - 0x64, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x83, 0x01, 0x0a, 0x15, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x73, - 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x72, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x20, 0x0a, 0x0b, - 0x61, 0x6c, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x07, - 0x0a, 0x05, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x45, 0x0a, 0x1b, 0x50, 0x69, 0x70, 0x65, 0x6c, - 0x69, 0x6e, 0x65, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, - 0x69, 0x62, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, - 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x83, - 0x01, 0x0a, 0x16, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x70, 0x69, 0x70, - 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0c, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, - 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x29, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, - 0x65, 0x57, 0x69, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x08, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x95, 0x01, 0x0a, 0x11, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, - 0x65, 0x57, 0x69, 0x74, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3c, 0x0a, 0x08, 0x70, 0x69, - 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x73, - 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x52, 0x08, - 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x42, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, + 0x65, 0x72, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, + 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x55, + 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x6b, 0x0a, 0x0c, 0x4c, 0x6f, 0x61, 0x64, 0x50, 0x69, 0x70, 0x65, + 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x2b, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, + 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x4c, 0x6f, + 0x61, 0x64, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2c, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x50, + 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x71, 0x0a, 0x0e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x69, 0x70, 0x65, 0x6c, + 0x69, 0x6e, 0x65, 0x12, 0x2d, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, + 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x55, 0x6e, 0x6c, + 0x6f, 0x61, 0x64, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, + 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, + 0x61, 0x64, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x74, 0x0a, 0x0f, 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x78, 0x70, + 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2e, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, - 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0xe4, 0x03, 0x0a, - 0x14, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, - 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, - 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, - 0x53, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x3b, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, - 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x50, 0x69, - 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x4c, 0x0a, 0x13, - 0x6c, 0x61, 0x73, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x13, 0x6c, 0x61, 0x73, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x20, 0x0a, 0x0b, 0x6d, 0x6f, - 0x64, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x61, 0x64, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0b, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x61, 0x64, 0x79, 0x22, 0xc4, 0x01, 0x0a, - 0x0e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x19, 0x0a, 0x15, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x50, 0x69, - 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x10, 0x01, 0x12, 0x14, - 0x0a, 0x10, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, - 0x6e, 0x67, 0x10, 0x02, 0x12, 0x11, 0x0a, 0x0d, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, - 0x52, 0x65, 0x61, 0x64, 0x79, 0x10, 0x03, 0x12, 0x12, 0x0a, 0x0e, 0x50, 0x69, 0x70, 0x65, 0x6c, - 0x69, 0x6e, 0x65, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x10, 0x04, 0x12, 0x15, 0x0a, 0x11, 0x50, - 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, - 0x10, 0x05, 0x12, 0x17, 0x0a, 0x13, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x65, - 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6e, 0x67, 0x10, 0x06, 0x12, 0x16, 0x0a, 0x12, 0x50, - 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, - 0x64, 0x10, 0x07, 0x22, 0x40, 0x0a, 0x16, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, - 0x0e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, - 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x49, 0x0a, 0x17, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, - 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x2e, 0x0a, 0x12, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x61, 0x70, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x22, 0x49, 0x0a, 0x1f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x50, 0x6c, 0x61, 0x6e, 0x65, - 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, - 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x75, 0x62, - 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xa2, 0x01, 0x0a, 0x14, - 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x32, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, - 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x40, - 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x11, 0x0a, 0x0d, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, - 0x57, 0x4e, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x45, - 0x4e, 0x44, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x45, 0x52, 0x53, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, - 0x53, 0x45, 0x4e, 0x44, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x53, 0x10, 0x02, - 0x2a, 0x27, 0x0a, 0x0c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x09, 0x0a, 0x05, 0x4d, 0x4f, 0x44, 0x45, 0x4c, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x50, - 0x49, 0x50, 0x45, 0x4c, 0x49, 0x4e, 0x45, 0x10, 0x01, 0x32, 0xde, 0x0f, 0x0a, 0x09, 0x53, 0x63, - 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x12, 0x6b, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x12, 0x2b, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, + 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, - 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, - 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x53, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x62, 0x0a, 0x09, 0x4c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x65, - 0x6c, 0x12, 0x28, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x4d, - 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x73, 0x65, + 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x71, 0x0a, 0x0e, 0x53, 0x74, + 0x6f, 0x70, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2d, 0x2e, 0x73, + 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, + 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x73, 0x65, + 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, + 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6d, 0x0a, + 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2b, 0x2e, + 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, + 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x73, 0x65, 0x6c, + 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, + 0x6c, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x6a, 0x0a, 0x0b, + 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2a, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, - 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x68, 0x0a, 0x0b, 0x55, 0x6e, 0x6c, 0x6f, - 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x2a, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, + 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, - 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, - 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x55, 0x6e, 0x6c, - 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x6b, 0x0a, 0x0c, 0x4c, 0x6f, 0x61, 0x64, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, - 0x6e, 0x65, 0x12, 0x2b, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, - 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x4c, 0x6f, 0x61, 0x64, - 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x2c, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x50, 0x69, 0x70, - 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x71, 0x0a, 0x0e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, - 0x65, 0x12, 0x2d, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, - 0x64, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2e, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, - 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x74, 0x0a, 0x0f, 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x78, 0x70, 0x65, 0x72, - 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2e, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, - 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, - 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x71, 0x0a, 0x0e, 0x53, 0x74, 0x6f, 0x70, - 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2d, 0x2e, 0x73, 0x65, 0x6c, + 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x73, 0x0a, 0x0e, 0x50, 0x69, 0x70, 0x65, + 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2d, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, - 0x6c, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x73, 0x65, 0x6c, 0x64, + 0x6c, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, - 0x65, 0x72, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6d, 0x0a, 0x0c, 0x53, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2b, 0x2e, 0x73, 0x65, + 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x79, 0x0a, + 0x10, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x2f, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x65, 0x72, + 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, + 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x65, + 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x74, 0x0a, 0x0f, 0x53, 0x63, 0x68, 0x65, + 0x64, 0x75, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2e, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, - 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, - 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, - 0x72, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x6a, 0x0a, 0x0b, 0x4d, 0x6f, - 0x64, 0x65, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2a, 0x2e, 0x73, 0x65, 0x6c, 0x64, - 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, - 0x65, 0x72, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, - 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x4d, - 0x6f, 0x64, 0x65, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x73, 0x0a, 0x0e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, - 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2d, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, - 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, - 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, + 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x73, 0x65, + 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, + 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7c, + 0x0a, 0x15, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x31, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, - 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x79, 0x0a, 0x10, 0x45, - 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x2f, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, - 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x30, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, - 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, - 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x74, 0x0a, 0x0f, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, - 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2e, 0x2e, 0x73, 0x65, 0x6c, 0x64, - 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, - 0x65, 0x72, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x73, 0x65, 0x6c, 0x64, - 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, - 0x65, 0x72, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7c, 0x0a, 0x15, - 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x31, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, - 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x53, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, - 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, - 0x72, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x79, 0x0a, 0x14, 0x53, 0x75, - 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x30, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, - 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x4d, 0x6f, 0x64, 0x65, - 0x6c, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, - 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x4d, 0x6f, - 0x64, 0x65, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x88, 0x01, 0x0a, 0x19, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, - 0x69, 0x62, 0x65, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x35, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, - 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x45, 0x78, 0x70, - 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x73, 0x65, 0x6c, + 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, - 0x6c, 0x65, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, - 0x12, 0x82, 0x01, 0x0a, 0x17, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x50, 0x69, - 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x33, 0x2e, 0x73, + 0x6c, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x79, 0x0a, 0x14, + 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x30, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, + 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x4d, 0x6f, + 0x64, 0x65, 0x6c, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, + 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, + 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x88, 0x01, 0x0a, 0x19, 0x53, 0x75, 0x62, 0x73, + 0x63, 0x72, 0x69, 0x62, 0x65, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x35, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, + 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x45, + 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, - 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x75, - 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x2e, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, - 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, - 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x82, 0x01, 0x0a, 0x15, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, - 0x69, 0x62, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x12, - 0x37, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, - 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, - 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, - 0x72, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x42, 0x3c, 0x5a, 0x3a, 0x67, 0x69, - 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x69, - 0x6f, 0x2f, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2d, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x61, 0x70, - 0x69, 0x73, 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x32, 0x2f, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2f, 0x73, - 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x45, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x30, 0x01, 0x12, 0x82, 0x01, 0x0a, 0x17, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, + 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x33, + 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, + 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, 0x65, 0x6c, 0x69, 0x6e, 0x65, + 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, + 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x50, 0x69, 0x70, + 0x65, 0x6c, 0x69, 0x6e, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x82, 0x01, 0x0a, 0x15, 0x53, 0x75, 0x62, 0x73, + 0x63, 0x72, 0x69, 0x62, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x50, 0x6c, 0x61, 0x6e, + 0x65, 0x12, 0x37, 0x2e, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, + 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x50, 0x6c, 0x61, 0x6e, 0x65, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x73, 0x65, 0x6c, + 0x64, 0x6f, 0x6e, 0x2e, 0x6d, 0x6c, 0x6f, 0x70, 0x73, 0x2e, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, + 0x6c, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x50, 0x6c, 0x61, 0x6e, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x42, 0x3c, 0x5a, 0x3a, + 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x73, 0x65, 0x6c, 0x64, 0x6f, + 0x6e, 0x69, 0x6f, 0x2f, 0x73, 0x65, 0x6c, 0x64, 0x6f, 0x6e, 0x2d, 0x63, 0x6f, 0x72, 0x65, 0x2f, + 0x61, 0x70, 0x69, 0x73, 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x32, 0x2f, 0x6d, 0x6c, 0x6f, 0x70, 0x73, + 0x2f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x33, } var ( @@ -5142,10 +5170,10 @@ var file_mlops_scheduler_scheduler_proto_depIdxs = []int32{ 22, // 4: seldon.mlops.scheduler.Model.streamSpec:type_name -> seldon.mlops.scheduler.StreamSpec 21, // 5: seldon.mlops.scheduler.MetaData.kubernetesMeta:type_name -> seldon.mlops.scheduler.KubernetesMeta 23, // 6: seldon.mlops.scheduler.ModelSpec.storageConfig:type_name -> seldon.mlops.scheduler.StorageConfig - 15, // 7: seldon.mlops.scheduler.ModelSpec.explainer:type_name -> seldon.mlops.scheduler.ExplainerSpec - 16, // 8: seldon.mlops.scheduler.ModelSpec.llm:type_name -> seldon.mlops.scheduler.LlmSpec - 14, // 9: seldon.mlops.scheduler.ModelSpec.parameters:type_name -> seldon.mlops.scheduler.ParameterSpec - 17, // 10: seldon.mlops.scheduler.ModelSpec.modelRuntimeInfo:type_name -> seldon.mlops.scheduler.ModelRuntimeInfo + 14, // 7: seldon.mlops.scheduler.ModelSpec.parameters:type_name -> seldon.mlops.scheduler.ParameterSpec + 17, // 8: seldon.mlops.scheduler.ModelSpec.modelRuntimeInfo:type_name -> seldon.mlops.scheduler.ModelRuntimeInfo + 15, // 9: seldon.mlops.scheduler.ModelSpec.explainer:type_name -> seldon.mlops.scheduler.ExplainerSpec + 16, // 10: seldon.mlops.scheduler.ModelSpec.llm:type_name -> seldon.mlops.scheduler.LlmSpec 18, // 11: seldon.mlops.scheduler.ModelRuntimeInfo.mlserver:type_name -> seldon.mlops.scheduler.MLServerModelSettings 19, // 12: seldon.mlops.scheduler.ModelRuntimeInfo.triton:type_name -> seldon.mlops.scheduler.TritonModelConfig 20, // 13: seldon.mlops.scheduler.TritonModelConfig.cpu:type_name -> seldon.mlops.scheduler.TritonCPU @@ -5975,7 +6003,10 @@ func file_mlops_scheduler_scheduler_proto_init() { } } file_mlops_scheduler_scheduler_proto_msgTypes[2].OneofWrappers = []any{} - file_mlops_scheduler_scheduler_proto_msgTypes[4].OneofWrappers = []any{} + file_mlops_scheduler_scheduler_proto_msgTypes[4].OneofWrappers = []any{ + (*ModelSpec_Explainer)(nil), + (*ModelSpec_Llm)(nil), + } file_mlops_scheduler_scheduler_proto_msgTypes[6].OneofWrappers = []any{} file_mlops_scheduler_scheduler_proto_msgTypes[7].OneofWrappers = []any{} file_mlops_scheduler_scheduler_proto_msgTypes[8].OneofWrappers = []any{ diff --git a/apis/mlops/scheduler/scheduler.proto b/apis/mlops/scheduler/scheduler.proto index 14cf08d216..d119de87f9 100644 --- a/apis/mlops/scheduler/scheduler.proto +++ b/apis/mlops/scheduler/scheduler.proto @@ -42,10 +42,14 @@ message ModelSpec { repeated string requirements = 4; // list of capabilities the server must satisfy to run this model optional uint64 memoryBytes = 5; // Requested memory optional string server = 6; // the particular model server to load the model. If unspecified will be chosen. - optional ExplainerSpec explainer = 7; // optional black box explainer details - optional LlmSpec llm = 8; // LLM specific settings - repeated ParameterSpec parameters = 9; // parameters to load with model - optional ModelRuntimeInfo modelRuntimeInfo = 10; // model specific settings that are sent by the agent + repeated ParameterSpec parameters = 8; // parameters to load with model + optional ModelRuntimeInfo modelRuntimeInfo = 9; // model specific settings that are sent by the agent + + // ensure only one of explainer or llm is specified at a time + oneof model_spec { + ExplainerSpec explainer = 7; // optional black box explainer details + LlmSpec llm = 10; // optional LLM specific settings + } } message ParameterSpec { From 6842e16d8e5cb23c2ccd7d9d0290c14a9e54571e Mon Sep 17 00:00:00 2001 From: Robert Date: Tue, 28 Jan 2025 14:44:57 +0000 Subject: [PATCH 13/18] Renamed setModelSettings to setExtraParameters --- scheduler/pkg/agent/repository/mlserver/mlserver.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scheduler/pkg/agent/repository/mlserver/mlserver.go b/scheduler/pkg/agent/repository/mlserver/mlserver.go index 82735de074..e33c65ce39 100644 --- a/scheduler/pkg/agent/repository/mlserver/mlserver.go +++ b/scheduler/pkg/agent/repository/mlserver/mlserver.go @@ -160,7 +160,7 @@ func (m *MLServerRepositoryHandler) updateNameAndVersion(path string, modelName return os.WriteFile(settingsPath, data, fs.ModePerm) } -func (m *MLServerRepositoryHandler) setModelSettings( +func (m *MLServerRepositoryHandler) setExtraParameters( modelRepoPath string, modelRef *string, pipelineRef *string, @@ -220,7 +220,7 @@ func (m *MLServerRepositoryHandler) setModelSettings( func (m *MLServerRepositoryHandler) SetExplainer(modelRepoPath string, explainerSpec *scheduler.ExplainerSpec, envoyHost string, envoyPort int) error { if explainerSpec != nil { - return m.setModelSettings( + return m.setExtraParameters( modelRepoPath, explainerSpec.ModelRef, explainerSpec.PipelineRef, @@ -237,7 +237,7 @@ func (m *MLServerRepositoryHandler) SetExplainer(modelRepoPath string, explainer func (m *MLServerRepositoryHandler) SetLlm(modelRepoPath string, llmSpec *scheduler.LlmSpec, envoyHost string, envoyPort int) error { if llmSpec != nil { - return m.setModelSettings( + return m.setExtraParameters( modelRepoPath, llmSpec.ModelRef, llmSpec.PipelineRef, From 3918179e2518fb16cf1974a50e79ac1c6359db45 Mon Sep 17 00:00:00 2001 From: Robert Date: Tue, 28 Jan 2025 15:39:44 +0000 Subject: [PATCH 14/18] Updated operator for mutual exclusive explainer and llm --- operator/apis/mlops/v1alpha1/model_types.go | 26 ++++-- .../apis/mlops/v1alpha1/model_types_test.go | 80 +++++++++++++++++-- 2 files changed, 92 insertions(+), 14 deletions(-) diff --git a/operator/apis/mlops/v1alpha1/model_types.go b/operator/apis/mlops/v1alpha1/model_types.go index fafc5d10a6..2d9df48f15 100644 --- a/operator/apis/mlops/v1alpha1/model_types.go +++ b/operator/apis/mlops/v1alpha1/model_types.go @@ -48,6 +48,13 @@ type ModelSpec struct { Llm *LlmSpec `json:"llm,omitempty"` } +func (m *ModelSpec) Validate() error { + if m.Explainer != nil && m.Llm != nil { + return fmt.Errorf("Can't have both explainer and llm in model spec.") + } + return nil +} + type ParameterSpec struct { Name string `json:"name"` Value string `json:"value"` @@ -156,6 +163,7 @@ func init() { // Method to convert Model resource to scheduler proto for communication with Scheduler func (m Model) AsSchedulerModel() (*scheduler.Model, error) { + m.Spec.Validate() // guarantees that Explainer and Llm are mutually exclusive md := &scheduler.Model{ Meta: &scheduler.MetaData{ Name: m.Name, @@ -175,16 +183,20 @@ func (m Model) AsSchedulerModel() (*scheduler.Model, error) { }, } if m.Spec.Explainer != nil { - md.ModelSpec.Explainer = &scheduler.ExplainerSpec{ - Type: m.Spec.Explainer.Type, - ModelRef: m.Spec.Explainer.ModelRef, - PipelineRef: m.Spec.Explainer.PipelineRef, + md.ModelSpec.ModelSpec = &scheduler.ModelSpec_Explainer{ + Explainer: &scheduler.ExplainerSpec{ + Type: m.Spec.Explainer.Type, + ModelRef: m.Spec.Explainer.ModelRef, + PipelineRef: m.Spec.Explainer.PipelineRef, + }, } } if m.Spec.Llm != nil { - md.ModelSpec.Llm = &scheduler.LlmSpec{ - ModelRef: m.Spec.Llm.ModelRef, - PipelineRef: m.Spec.Llm.PipelineRef, + md.ModelSpec.ModelSpec = &scheduler.ModelSpec_Llm{ + Llm: &scheduler.LlmSpec{ + ModelRef: m.Spec.Llm.ModelRef, + PipelineRef: m.Spec.Llm.PipelineRef, + }, } } if len(m.Spec.Parameters) > 0 { diff --git a/operator/apis/mlops/v1alpha1/model_types_test.go b/operator/apis/mlops/v1alpha1/model_types_test.go index e79ef8d76f..0fba41a1f5 100644 --- a/operator/apis/mlops/v1alpha1/model_types_test.go +++ b/operator/apis/mlops/v1alpha1/model_types_test.go @@ -75,7 +75,7 @@ func TestAsModelDetails(t *testing.T) { }, }, { - name: "complex", + name: "complex - explainer", model: &Model{ ObjectMeta: metav1.ObjectMeta{ Name: "foo", @@ -96,6 +96,74 @@ func TestAsModelDetails(t *testing.T) { Type: "anchor_tabular", ModelRef: &incomeModel, }, + Parameters: []ParameterSpec{ + { + Name: "foo", + Value: "bar", + }, + { + Name: "foo2", + Value: "bar2", + }, + }, + }, + }, + modelpb: &scheduler.Model{ + Meta: &scheduler.MetaData{ + Name: "foo", + KubernetesMeta: &scheduler.KubernetesMeta{ + Namespace: "default", + Generation: 1, + }, + }, + ModelSpec: &scheduler.ModelSpec{ + Uri: "gs://test", + Requirements: []string{"a", "b", modelType}, + StorageConfig: &scheduler.StorageConfig{Config: &scheduler.StorageConfig_StorageSecretName{StorageSecretName: secret}}, + Server: &server, + ModelSpec: &scheduler.ModelSpec_Explainer{ + Explainer: &scheduler.ExplainerSpec{ + Type: "anchor_tabular", + ModelRef: &incomeModel, + }, + }, + Parameters: []*scheduler.ParameterSpec{ + { + Name: "foo", + Value: "bar", + }, + { + Name: "foo2", + Value: "bar2", + }, + }, + }, + DeploymentSpec: &scheduler.DeploymentSpec{ + Replicas: 4, + LogPayloads: true, + MinReplicas: 0, + MaxReplicas: 0, + }, + }, + }, + { + name: "complex - llm", + model: &Model{ + ObjectMeta: metav1.ObjectMeta{ + Name: "foo", + Namespace: "default", + Generation: 1, + }, + Spec: ModelSpec{ + InferenceArtifactSpec: InferenceArtifactSpec{ + ModelType: &modelType, + StorageURI: "gs://test", + SecretName: &secret, + }, + Logger: &LoggingSpec{}, + Requirements: []string{"a", "b"}, + ScalingSpec: ScalingSpec{Replicas: &replicas}, + Server: &server, Llm: &LlmSpec{ ModelRef: &llmModel, }, @@ -124,12 +192,10 @@ func TestAsModelDetails(t *testing.T) { Requirements: []string{"a", "b", modelType}, StorageConfig: &scheduler.StorageConfig{Config: &scheduler.StorageConfig_StorageSecretName{StorageSecretName: secret}}, Server: &server, - Explainer: &scheduler.ExplainerSpec{ - Type: "anchor_tabular", - ModelRef: &incomeModel, - }, - Llm: &scheduler.LlmSpec{ - ModelRef: &llmModel, + ModelSpec: &scheduler.ModelSpec_Llm{ + Llm: &scheduler.LlmSpec{ + ModelRef: &llmModel, + }, }, Parameters: []*scheduler.ParameterSpec{ { From 9a9bd1e637d61c2b2b6318c454f2d4ff92e280f7 Mon Sep 17 00:00:00 2001 From: Robert Date: Tue, 28 Jan 2025 15:47:03 +0000 Subject: [PATCH 15/18] Included model spec validation test --- .../apis/mlops/v1alpha1/model_types_test.go | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/operator/apis/mlops/v1alpha1/model_types_test.go b/operator/apis/mlops/v1alpha1/model_types_test.go index 0fba41a1f5..79b82bca8e 100644 --- a/operator/apis/mlops/v1alpha1/model_types_test.go +++ b/operator/apis/mlops/v1alpha1/model_types_test.go @@ -24,6 +24,55 @@ import ( scheduler "github.com/seldonio/seldon-core/apis/go/v2/mlops/scheduler" ) +func TestModelSpec_Validate(t *testing.T) { + g := NewGomegaWithT(t) + tests := []struct { + name string + spec *ModelSpec + wantErr bool + }{ + { + name: "Both explainer and llm set", + spec: &ModelSpec{ + Explainer: &ExplainerSpec{}, + Llm: &LlmSpec{}, + }, + wantErr: true, + }, + { + name: "Only explainer set", + spec: &ModelSpec{ + Explainer: &ExplainerSpec{}, + }, + wantErr: false, + }, + { + name: "Only llm set", + spec: &ModelSpec{ + Llm: &LlmSpec{}, + }, + wantErr: false, + }, + { + name: "Neither explainer nor llm set", + spec: &ModelSpec{}, + wantErr: false, + }, + } + + for _, tt := range tests { + err := tt.spec.Validate() + + if tt.wantErr { + g.Expect(err).ToNot(BeNil()) + g.Expect(err.Error()).To(ContainSubstring("Can't have both explainer and llm in model spec.")) + } else { + g.Expect(err).To(BeNil()) + } + } + +} + func TestAsModelDetails(t *testing.T) { g := NewGomegaWithT(t) type test struct { From 81e2fa1d2bf30683095e7545a3cbe2bd461ac6a1 Mon Sep 17 00:00:00 2001 From: Robert Date: Tue, 28 Jan 2025 15:54:12 +0000 Subject: [PATCH 16/18] Use map as param in customize function in scheduler --- scheduler/pkg/agent/repository/mlserver/mlserver.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/scheduler/pkg/agent/repository/mlserver/mlserver.go b/scheduler/pkg/agent/repository/mlserver/mlserver.go index e33c65ce39..fd31981a18 100644 --- a/scheduler/pkg/agent/repository/mlserver/mlserver.go +++ b/scheduler/pkg/agent/repository/mlserver/mlserver.go @@ -166,7 +166,7 @@ func (m *MLServerRepositoryHandler) setExtraParameters( pipelineRef *string, envoyHost string, envoyPort int, - customize func(*ModelSettings) error, + customize func(map[string]interface{}) error, ) error { workers := 0 settingsPath := filepath.Join(modelRepoPath, mlserverConfigFilename) @@ -204,7 +204,7 @@ func (m *MLServerRepositoryHandler) setExtraParameters( // custom logic for specific caller if customize != nil { - if err := customize(ms); err != nil { + if err := customize(ms.Parameters.Extra); err != nil { return err } } @@ -226,8 +226,8 @@ func (m *MLServerRepositoryHandler) SetExplainer(modelRepoPath string, explainer explainerSpec.PipelineRef, envoyHost, envoyPort, - func(ms *ModelSettings) error { - ms.Parameters.Extra[explainerTypeKey] = &explainerSpec.Type + func(extra map[string]interface{}) error { + extra[explainerTypeKey] = &explainerSpec.Type return nil }, ) From 6a60422e0240357c25e690a64745b9f6dc29d8d0 Mon Sep 17 00:00:00 2001 From: Robert Date: Tue, 28 Jan 2025 16:01:15 +0000 Subject: [PATCH 17/18] Fix return err from spec validation step --- operator/apis/mlops/v1alpha1/model_types.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/operator/apis/mlops/v1alpha1/model_types.go b/operator/apis/mlops/v1alpha1/model_types.go index 2d9df48f15..904d6dd4d1 100644 --- a/operator/apis/mlops/v1alpha1/model_types.go +++ b/operator/apis/mlops/v1alpha1/model_types.go @@ -163,7 +163,10 @@ func init() { // Method to convert Model resource to scheduler proto for communication with Scheduler func (m Model) AsSchedulerModel() (*scheduler.Model, error) { - m.Spec.Validate() // guarantees that Explainer and Llm are mutually exclusive + // guarantees that Explainer and Llm are mutually exclusive + if err := m.Spec.Validate(); err != nil { + return nil, err + } md := &scheduler.Model{ Meta: &scheduler.MetaData{ Name: m.Name, From 579ab9e80591cb40caab08e5ac956ad47b447580 Mon Sep 17 00:00:00 2001 From: Robert Date: Tue, 28 Jan 2025 17:28:56 +0000 Subject: [PATCH 18/18] Replaced customize function with map --- .../pkg/agent/repository/mlserver/mlserver.go | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/scheduler/pkg/agent/repository/mlserver/mlserver.go b/scheduler/pkg/agent/repository/mlserver/mlserver.go index fd31981a18..8965fca2c0 100644 --- a/scheduler/pkg/agent/repository/mlserver/mlserver.go +++ b/scheduler/pkg/agent/repository/mlserver/mlserver.go @@ -166,7 +166,7 @@ func (m *MLServerRepositoryHandler) setExtraParameters( pipelineRef *string, envoyHost string, envoyPort int, - customize func(map[string]interface{}) error, + extra map[string]interface{}, ) error { workers := 0 settingsPath := filepath.Join(modelRepoPath, mlserverConfigFilename) @@ -202,11 +202,9 @@ func (m *MLServerRepositoryHandler) setExtraParameters( ms.Parameters.Extra[inferUriKey] = &inferUri } - // custom logic for specific caller - if customize != nil { - if err := customize(ms.Parameters.Extra); err != nil { - return err - } + // add extra parameters if any + for key, value := range extra { + ms.Parameters.Extra[key] = value } data, err := json.Marshal(ms) @@ -226,9 +224,8 @@ func (m *MLServerRepositoryHandler) SetExplainer(modelRepoPath string, explainer explainerSpec.PipelineRef, envoyHost, envoyPort, - func(extra map[string]interface{}) error { - extra[explainerTypeKey] = &explainerSpec.Type - return nil + map[string]interface{}{ + explainerTypeKey: explainerSpec.Type, }, ) }