From 0e53d62c94a3fb08de3b09e625fa5e5c41f6e639 Mon Sep 17 00:00:00 2001 From: Alex Tymchuk Date: Mon, 18 Sep 2023 08:49:45 +0000 Subject: [PATCH 01/41] PMM-12375 create serviceInfoBroker component --- .golangci.yml | 2 + admin/commands/management/add.go | 2 +- agent/client/client.go | 7 +- agent/client/client_test.go | 12 +- agent/client/deps.go | 6 + agent/client/mock_service_info_broker_test.go | 47 + agent/commands/run.go | 4 +- agent/connectionchecker/connection_checker.go | 17 - .../serviceinfobroker/service_info_broker.go | 291 +++ api/agentpb/agent.go | 24 +- api/agentpb/agent.pb.go | 1950 ++++++++++------- api/agentpb/agent.pb.validate.go | 358 +++ api/agentpb/agent.proto | 35 +- .../add_mongo_db_service_responses.go | 3 + .../services/add_my_sql_service_responses.go | 3 + .../add_postgre_sql_service_responses.go | 3 + .../add_proxy_sql_service_responses.go | 3 + .../client/services/get_service_responses.go | 12 + .../services/list_services_responses.go | 12 + api/inventorypb/json/inventorypb.json | 60 + api/inventorypb/services.pb.go | 1213 +++++----- api/inventorypb/services.pb.validate.go | 8 + api/inventorypb/services.proto | 8 + api/managementpb/backup/json/backup.json | 10 + ..._artifact_compatible_services_responses.go | 6 + .../client/mongo_db/add_mongo_db_responses.go | 3 + .../client/my_sql/add_my_sql_responses.go | 3 + .../postgre_sql/add_postgre_sql_responses.go | 3 + .../proxy_sql/add_proxy_sql_responses.go | 3 + .../json/client/rds/add_rds_responses.go | 6 + api/managementpb/json/managementpb.json | 30 + .../mgmt_service/list_services_responses.go | 3 + api/managementpb/service/json/service.json | 5 + api/managementpb/service/service.pb.go | 110 +- .../service/service.pb.validate.go | 2 + api/managementpb/service/service.proto | 2 + api/swagger/swagger-dev.json | 105 + api/swagger/swagger.json | 100 + managed/cmd/pmm-managed/main.go | 11 +- managed/models/database.go | 6 +- managed/models/service_model.go | 1 + managed/models/service_model_reform.go | 17 +- managed/services/agents/channel/channel.go | 2 + managed/services/agents/connection_checker.go | 36 +- .../services/agents/service_info_broker.go | 207 ++ .../services/backup/pitr_timerange_service.go | 2 +- managed/services/inventory/agents.go | 64 +- managed/services/inventory/deps.go | 6 + .../mock_service_info_broker_test.go | 46 + managed/services/inventory/services_test.go | 5 +- managed/services/management/deps.go | 5 + managed/services/management/mongodb.go | 8 +- managed/services/management/mysql.go | 8 +- managed/services/management/postgresql.go | 8 +- managed/services/management/proxysql.go | 8 +- 55 files changed, 3330 insertions(+), 1581 deletions(-) create mode 100644 agent/client/mock_service_info_broker_test.go create mode 100644 agent/serviceinfobroker/service_info_broker.go create mode 100644 managed/services/agents/service_info_broker.go create mode 100644 managed/services/inventory/mock_service_info_broker_test.go diff --git a/.golangci.yml b/.golangci.yml index ff07ed391b..cd8d9720fe 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -104,6 +104,8 @@ linters: - nlreturn # too annoying - nosnakecase # deprecated - scopelint # too many false positives + - structcheck # replaced by unused + - varcheck # replaced by unused - varnamelen # useless - wrapcheck # we do not use wrapping everywhere - wsl # too annoying diff --git a/admin/commands/management/add.go b/admin/commands/management/add.go index 59c623fe3f..087da8fdaa 100644 --- a/admin/commands/management/add.go +++ b/admin/commands/management/add.go @@ -21,7 +21,7 @@ import ( // AddCommand is used by Kong for CLI flags and commands. type AddCommand struct { - External AddExternalCommand `cmd:"" help:"Add External source of data (like a custom exporter running on a port) to the monitoring"` + External AddExternalCommand `cmd:"" help:"Add External source of data (like a custom exporter running on a port) to monitoring"` ExternalServerless AddExternalServerlessCommand `cmd:"" help:"Add External Service on Remote node to monitoring"` HAProxy AddHAProxyCommand `cmd:"" name:"haproxy" help:"Add HAProxy to monitoring"` MongoDB AddMongoDBCommand `cmd:"" name:"mongodb" help:"Add MongoDB to monitoring"` diff --git a/agent/client/client.go b/agent/client/client.go index a7906b6ef1..7709438602 100644 --- a/agent/client/client.go +++ b/agent/client/client.go @@ -68,6 +68,7 @@ type Client struct { supervisor supervisor connectionChecker connectionChecker softwareVersioner softwareVersioner + serviceInfoBroker serviceInfoBroker l *logrus.Entry backoff *backoff.Backoff @@ -89,12 +90,13 @@ type Client struct { // New creates new client. // // Caller should call Run. -func New(cfg configGetter, supervisor supervisor, r *runner.Runner, connectionChecker connectionChecker, sv softwareVersioner, cus *connectionuptime.Service, logStore *tailog.Store) *Client { //nolint:lll +func New(cfg configGetter, supervisor supervisor, r *runner.Runner, connectionChecker connectionChecker, sv softwareVersioner, sib serviceInfoBroker, cus *connectionuptime.Service, logStore *tailog.Store) *Client { //nolint:lll return &Client{ cfg: cfg, supervisor: supervisor, connectionChecker: connectionChecker, softwareVersioner: sv, + serviceInfoBroker: sib, l: logrus.WithField("component", "client"), backoff: backoff.New(backoffMinDelay, backoffMaxDelay), dialTimeout: dialTimeout, @@ -388,6 +390,9 @@ loop: case *agentpb.CheckConnectionRequest: responsePayload = c.connectionChecker.Check(ctx, p, req.ID) + case *agentpb.ServiceInfoRequest: + responsePayload = c.serviceInfoBroker.GetInfoFromService(ctx, p, req.ID) + case *agentpb.StartJobRequest: var resp agentpb.StartJobResponse if err := c.handleStartJobRequest(p); err != nil { diff --git a/agent/client/client_test.go b/agent/client/client_test.go index afb17d091b..d286b81b88 100644 --- a/agent/client/client_test.go +++ b/agent/client/client_test.go @@ -83,7 +83,7 @@ func TestClient(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) cfgStorage := config.NewStorage(&config.Config{}) - client := New(cfgStorage, nil, nil, nil, nil, nil, nil) + client := New(cfgStorage, nil, nil, nil, nil, nil, nil, nil) cancel() err := client.Run(ctx) assert.EqualError(t, err, "missing PMM Server address: context canceled") @@ -98,7 +98,7 @@ func TestClient(t *testing.T) { Address: "127.0.0.1:1", }, }) - client := New(cfgStorage, nil, nil, nil, nil, nil, nil) + client := New(cfgStorage, nil, nil, nil, nil, nil, nil, nil) cancel() err := client.Run(ctx) assert.EqualError(t, err, "missing Agent ID: context canceled") @@ -115,7 +115,7 @@ func TestClient(t *testing.T) { Address: "127.0.0.1:1", }, }) - client := New(cfgStorage, nil, nil, nil, nil, connectionuptime.NewService(time.Hour), nil) + client := New(cfgStorage, nil, nil, nil, nil, nil, connectionuptime.NewService(time.Hour), nil) err := client.Run(ctx) assert.EqualError(t, err, "failed to dial: context deadline exceeded") }) @@ -164,7 +164,7 @@ func TestClient(t *testing.T) { s.On("ClearChangesChannel").Return() r := runner.New(cfgStorage.Get().RunnerCapacity) - client := New(cfgStorage, &s, r, nil, nil, connectionuptime.NewService(time.Hour), nil) + client := New(cfgStorage, &s, r, nil, nil, nil, connectionuptime.NewService(time.Hour), nil) err := client.Run(context.Background()) assert.NoError(t, err) assert.Equal(t, serverMD, client.GetServerConnectMetadata()) @@ -192,7 +192,7 @@ func TestClient(t *testing.T) { }, }) - client := New(cfgStorage, nil, nil, nil, nil, connectionuptime.NewService(time.Hour), nil) + client := New(cfgStorage, nil, nil, nil, nil, nil, connectionuptime.NewService(time.Hour), nil) client.dialTimeout = 100 * time.Millisecond err := client.Run(ctx) assert.EqualError(t, err, "failed to get server metadata: rpc error: code = Canceled desc = context canceled", "%+v", err) @@ -282,7 +282,7 @@ func TestUnexpectedActionType(t *testing.T) { s.On("ClearChangesChannel").Return() r := runner.New(cfgStorage.Get().RunnerCapacity) - client := New(cfgStorage, s, r, nil, nil, connectionuptime.NewService(time.Hour), nil) + client := New(cfgStorage, s, r, nil, nil, nil, connectionuptime.NewService(time.Hour), nil) err := client.Run(context.Background()) assert.NoError(t, err) assert.Equal(t, serverMD, client.GetServerConnectMetadata()) diff --git a/agent/client/deps.go b/agent/client/deps.go index 4310931445..116ffcc69f 100644 --- a/agent/client/deps.go +++ b/agent/client/deps.go @@ -24,6 +24,7 @@ import ( ) //go:generate ../../bin/mockery --name=connectionChecker --case=snake --inpackage --testonly +//go:generate ../../bin/mockery --name=serviceInfoBroker --case=snake --inpackage --testonly //go:generate ../../bin/mockery --name=supervisor --case=snake --inpackage --testonly // connectionChecker is a subset of methods of connectionchecker.ConnectionChecker used by this package. @@ -32,6 +33,11 @@ type connectionChecker interface { Check(ctx context.Context, req *agentpb.CheckConnectionRequest, id uint32) *agentpb.CheckConnectionResponse } +// serviceInfoBroker is a subset of methods of serviceinfobroker.ServiceInfoBroker used by this package. +type serviceInfoBroker interface { + GetInfoFromService(ctx context.Context, req *agentpb.ServiceInfoRequest, id uint32) *agentpb.ServiceInfoResponse +} + // softwareVersioner is a subset of methods of version.Versioner used by this package. type softwareVersioner interface { MySQLdVersion() (string, error) diff --git a/agent/client/mock_service_info_broker_test.go b/agent/client/mock_service_info_broker_test.go new file mode 100644 index 0000000000..bceb3d7046 --- /dev/null +++ b/agent/client/mock_service_info_broker_test.go @@ -0,0 +1,47 @@ +// Code generated by mockery v2.33.0. DO NOT EDIT. + +package client + +import ( + context "context" + + mock "github.com/stretchr/testify/mock" + + agentpb "github.com/percona/pmm/api/agentpb" +) + +// mockServiceInfoBroker is an autogenerated mock type for the serviceInfoBroker type +type mockServiceInfoBroker struct { + mock.Mock +} + +// GetInfoFromService provides a mock function with given fields: ctx, req, id +func (_m *mockServiceInfoBroker) GetInfoFromService(ctx context.Context, req *agentpb.ServiceInfoRequest, id uint32) *agentpb.ServiceInfoResponse { + ret := _m.Called(ctx, req, id) + + var r0 *agentpb.ServiceInfoResponse + if rf, ok := ret.Get(0).(func(context.Context, *agentpb.ServiceInfoRequest, uint32) *agentpb.ServiceInfoResponse); ok { + r0 = rf(ctx, req, id) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*agentpb.ServiceInfoResponse) + } + } + + return r0 +} + +// newMockServiceInfoBroker creates a new instance of mockServiceInfoBroker. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockServiceInfoBroker(t interface { + mock.TestingT + Cleanup(func()) +}, +) *mockServiceInfoBroker { + mock := &mockServiceInfoBroker{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/agent/commands/run.go b/agent/commands/run.go index cc384a75a9..8afdf13cb1 100644 --- a/agent/commands/run.go +++ b/agent/commands/run.go @@ -33,6 +33,7 @@ import ( "github.com/percona/pmm/agent/connectionchecker" "github.com/percona/pmm/agent/connectionuptime" "github.com/percona/pmm/agent/runner" + "github.com/percona/pmm/agent/serviceinfobroker" "github.com/percona/pmm/agent/tailog" "github.com/percona/pmm/agent/versioner" "github.com/percona/pmm/api/inventorypb" @@ -69,8 +70,9 @@ func Run() { supervisor := supervisor.NewSupervisor(ctx, v, configStorage) connectionChecker := connectionchecker.New(configStorage) + serviceInfoBroker := serviceinfobroker.New(configStorage) r := runner.New(cfg.RunnerCapacity) - client := client.New(configStorage, supervisor, r, connectionChecker, v, prepareConnectionService(ctx, cfg), logStore) + client := client.New(configStorage, supervisor, r, connectionChecker, v, serviceInfoBroker, prepareConnectionService(ctx, cfg), logStore) localServer := agentlocal.NewServer(configStorage, supervisor, client, configFilepath, logStore) logrus.Infof("Window check connection time is %.2f hour(s)", cfg.WindowConnectedTime.Hours()) diff --git a/agent/connectionchecker/connection_checker.go b/agent/connectionchecker/connection_checker.go index 280c406844..c23281c3b5 100644 --- a/agent/connectionchecker/connection_checker.go +++ b/agent/connectionchecker/connection_checker.go @@ -21,7 +21,6 @@ import ( "database/sql" "fmt" "io" - "math" "net/http" "path/filepath" "strconv" @@ -140,22 +139,6 @@ func (cc *ConnectionChecker) checkMySQLConnection(ctx context.Context, dsn strin } else { res.Error = err.Error() } - return &res - } - - var count uint64 - if err = db.QueryRowContext(ctx, "SELECT /* agent='connectionchecker' */ COUNT(*) FROM information_schema.tables").Scan(&count); err != nil { - res.Error = err.Error() - return &res - } - - tableCount := int32(count) - if count > math.MaxInt32 { - tableCount = math.MaxInt32 - } - - res.Stats = &agentpb.CheckConnectionResponse_Stats{ - TableCount: tableCount, } return &res diff --git a/agent/serviceinfobroker/service_info_broker.go b/agent/serviceinfobroker/service_info_broker.go new file mode 100644 index 0000000000..129228afe4 --- /dev/null +++ b/agent/serviceinfobroker/service_info_broker.go @@ -0,0 +1,291 @@ +// Copyright 2019 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package serviceinfobroker helps extract various information from databases. +package serviceinfobroker + +import ( + "context" + "crypto/x509" + "database/sql" + "fmt" + "math" + "path/filepath" + "strconv" + "strings" + + "github.com/go-sql-driver/mysql" + "github.com/lib/pq" + "github.com/pkg/errors" + "github.com/sirupsen/logrus" + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + + "github.com/percona/pmm/agent/config" + "github.com/percona/pmm/agent/tlshelpers" + "github.com/percona/pmm/agent/utils/mongo_fix" + "github.com/percona/pmm/agent/utils/templates" + "github.com/percona/pmm/api/agentpb" + "github.com/percona/pmm/api/inventorypb" +) + +// configGetter allows for getting a config. +type configGetter interface { + Get() *config.Config +} + +// ServiceInfoBroker is a struct to check connection to services. +type ServiceInfoBroker struct { + l *logrus.Entry + cfg configGetter +} + +// New creates new ServiceInfoBroker. +func New(cfg configGetter) *ServiceInfoBroker { + return &ServiceInfoBroker{ + l: logrus.WithField("component", "serviceinfobroker"), + cfg: cfg, + } +} + +func (sib *ServiceInfoBroker) sqlPing(ctx context.Context, db *sql.DB) error { + // use both query tag and SELECT value to cover both comments and values stripping by the server + var dest string + err := db.QueryRowContext(ctx, `SELECT /* agent='serviceinfobroker' */ 'pmm-agent'`).Scan(&dest) + sib.l.Debugf("sqlPing: %v", err) + return err +} + +// GetInfoFromService gathers information from a service. It returns context cancelation/timeout or driver errors as is. +func (sib *ServiceInfoBroker) GetInfoFromService(ctx context.Context, msg *agentpb.ServiceInfoRequest, id uint32) *agentpb.ServiceInfoResponse { + timeout := msg.Timeout.AsDuration() + if timeout > 0 { + var cancel context.CancelFunc + ctx, cancel = context.WithTimeout(ctx, timeout) + defer cancel() + } + + switch msg.Type { + case inventorypb.ServiceType_MYSQL_SERVICE: + return sib.getMySQLInfo(ctx, msg.Dsn, msg.TextFiles, msg.TlsSkipVerify, id) + case inventorypb.ServiceType_MONGODB_SERVICE: + return sib.getMongoDBInfo(ctx, msg.Dsn, msg.TextFiles, id) + case inventorypb.ServiceType_POSTGRESQL_SERVICE: + return sib.getPostgreSQLInfo(ctx, msg.Dsn, msg.TextFiles, id) + case inventorypb.ServiceType_PROXYSQL_SERVICE: + return sib.getProxySQLInfo(ctx, msg.Dsn) + // NOTE: inventorypb.ServiceType_EXTERNAL_SERVICE, inventorypb.ServiceType_HAPROXY_SERVICE can't be implemented for now + default: + panic(fmt.Sprintf("unknown service type: %v", msg.Type)) + } +} + +func (sib *ServiceInfoBroker) getMySQLInfo(ctx context.Context, dsn string, files *agentpb.TextFiles, tlsSkipVerify bool, id uint32) *agentpb.ServiceInfoResponse { //nolint:lll,unparam + var res agentpb.ServiceInfoResponse + var err error + + if files != nil { + err = tlshelpers.RegisterMySQLCerts(files.Files) + if err != nil { + sib.l.Debugf("getMySQLInfo: failed to register cert: %s", err) + res.Error = err.Error() + return &res + } + } + + cfg, err := mysql.ParseDSN(dsn) + if err != nil { + sib.l.Debugf("getMySQLInfo: failed to parse DSN: %s", err) + res.Error = err.Error() + return &res + } + + tempdir := filepath.Join(sib.cfg.Get().Paths.TempDir, strings.ToLower("get-mysql-info"), strconv.Itoa(int(id))) + _, err = templates.RenderDSN(dsn, files, tempdir) + if err != nil { + sib.l.Debugf("getMySQLInfo: failed to Render DSN: %s", err) + res.Error = err.Error() + return &res + } + + connector, err := mysql.NewConnector(cfg) + if err != nil { + sib.l.Debugf("getMySQLInfo: failed to create connector: %s", err) + res.Error = err.Error() + return &res + } + + db := sql.OpenDB(connector) + defer db.Close() //nolint:errcheck + + if err = sib.sqlPing(ctx, db); err != nil { + if errors.As(err, &x509.HostnameError{}) { + res.Error = errors.Wrap(err, + "mysql ssl certificate is misconfigured, make sure the certificate includes the requested hostname/IP in CN or subjectAltName fields").Error() + } else { + res.Error = err.Error() + } + return &res + } + + var count uint64 + if err = db.QueryRowContext(ctx, "SELECT /* agent='serviceinfobroker' */ COUNT(*) FROM information_schema.tables").Scan(&count); err != nil { + res.Error = err.Error() + return &res + } + + tableCount := int32(count) + if count > math.MaxInt32 { + tableCount = math.MaxInt32 + } + + var version string + if err = db.QueryRowContext(ctx, "SELECT /* agent='serviceinfobroker' */ VERSION()").Scan(&version); err != nil { + res.Error = err.Error() + return &res + } + + res.TableCount = tableCount + res.Version = version + + return &res +} + +func (sib *ServiceInfoBroker) getMongoDBInfo(ctx context.Context, dsn string, files *agentpb.TextFiles, id uint32) *agentpb.ServiceInfoResponse { + var res agentpb.ServiceInfoResponse + var err error + + tempdir := filepath.Join(sib.cfg.Get().Paths.TempDir, strings.ToLower("get-mongodb-info"), strconv.Itoa(int(id))) + dsn, err = templates.RenderDSN(dsn, files, tempdir) + if err != nil { + sib.l.Debugf("getMongoDBInfo: failed to Render DSN: %s", err) + res.Error = err.Error() + return &res + } + + opts, err := mongo_fix.ClientOptionsForDSN(dsn) + if err != nil { + sib.l.Debugf("failed to parse DSN: %s", err) + res.Error = err.Error() + return &res + } + + client, err := mongo.Connect(ctx, opts) + if err != nil { + sib.l.Debugf("getMongoDBInfo: failed to Connect: %s", err) + res.Error = err.Error() + return &res + } + defer client.Disconnect(ctx) //nolint:errcheck + + if err = client.Ping(ctx, nil); err != nil { + sib.l.Debugf("getMongoDBInfo: failed to Ping: %s", err) + res.Error = err.Error() + return &res + } + + resp := client.Database("admin").RunCommand(ctx, bson.D{{Key: "getDiagnosticData", Value: 1}}) + if err = resp.Err(); err != nil { + sib.l.Debugf("getMongoDBInfo: failed to runCommand getDiagnosticData: %s", err) + res.Error = err.Error() + return &res + } + + resp = client.Database("admin").RunCommand(ctx, bson.D{{Key: "buildInfo", Value: 1}}) + if err = resp.Err(); err != nil { + res.Error = err.Error() + return &res + } + + buildInfo := struct { + Version string `bson:"version"` + }{} + + if err = resp.Decode(&buildInfo); err != nil { + sib.l.Debugf("getMongoDBInfo: failed to decode buildInfo: %s", err) + return &res + } + + res.Version = buildInfo.Version + + return &res +} + +func (sib *ServiceInfoBroker) getPostgreSQLInfo(ctx context.Context, dsn string, files *agentpb.TextFiles, id uint32) *agentpb.ServiceInfoResponse { + var res agentpb.ServiceInfoResponse + var err error + + tempdir := filepath.Join(sib.cfg.Get().Paths.TempDir, strings.ToLower("get-postgresql-info"), strconv.Itoa(int(id))) + dsn, err = templates.RenderDSN(dsn, files, tempdir) + if err != nil { + sib.l.Debugf("getPostgreSQLInfo: failed to Render DSN: %s", err) + res.Error = err.Error() + return &res + } + + c, err := pq.NewConnector(dsn) + if err != nil { + res.Error = err.Error() + return &res + } + db := sql.OpenDB(c) + defer db.Close() //nolint:errcheck + + if err = sib.sqlPing(ctx, db); err != nil { + res.Error = err.Error() + } + + var version string + if err = db.QueryRowContext(ctx, "SHOW /* agent='serviceinfobroker' */ SERVER_VERSION").Scan(&version); err != nil { + res.Error = err.Error() + return &res + } + + res.Version = version + + return &res +} + +func (sib *ServiceInfoBroker) getProxySQLInfo(ctx context.Context, dsn string) *agentpb.ServiceInfoResponse { + var res agentpb.ServiceInfoResponse + + cfg, err := mysql.ParseDSN(dsn) + if err != nil { + res.Error = err.Error() + return &res + } + + connector, err := mysql.NewConnector(cfg) + if err != nil { + res.Error = err.Error() + return &res + } + + db := sql.OpenDB(connector) + defer db.Close() //nolint:errcheck + + if err = sib.sqlPing(ctx, db); err != nil { + res.Error = err.Error() + } + + var version string + if err := db.QueryRowContext(ctx, "SELECT /* agent='serviceinfobroker' */ @@GLOBAL.'admin-version'").Scan(&version); err != nil { + res.Error = err.Error() + return &res + } + + res.Version = version + + return &res +} diff --git a/api/agentpb/agent.go b/api/agentpb/agent.go index 4b90297431..9ab21bdb03 100644 --- a/api/agentpb/agent.go +++ b/api/agentpb/agent.go @@ -102,6 +102,10 @@ func (m *CheckConnectionResponse) AgentMessageResponsePayload() isAgentMessage_P return &AgentMessage_CheckConnection{CheckConnection: m} } +func (m *ServiceInfoResponse) AgentMessageResponsePayload() isAgentMessage_Payload { //nolint:ireturn + return &AgentMessage_ServiceInfo{ServiceInfo: m} +} + func (m *JobStatusResponse) AgentMessageResponsePayload() isAgentMessage_Payload { //nolint:ireturn return &AgentMessage_JobStatus{JobStatus: m} } @@ -198,21 +202,31 @@ func (m *AgentLogsRequest) ServerMessageRequestPayload() isServerMessage_Payload return &ServerMessage_AgentLogs{AgentLogs: m} } +func (m *ServiceInfoRequest) ServerMessageRequestPayload() isServerMessage_Payload { //nolint:ireturn + return &ServerMessage_ServiceInfo{ServiceInfo: m} +} + // in alphabetical order. func (*ActionResultRequest) sealed() {} func (*ActionResultResponse) sealed() {} +func (*AgentLogsRequest) sealed() {} +func (*AgentLogsResponse) sealed() {} func (*CheckConnectionRequest) sealed() {} func (*CheckConnectionResponse) sealed() {} +func (*GetVersionsRequest) sealed() {} +func (*GetVersionsResponse) sealed() {} func (*JobProgress) sealed() {} func (*JobResult) sealed() {} func (*JobStatusRequest) sealed() {} func (*JobStatusResponse) sealed() {} -func (*AgentLogsRequest) sealed() {} -func (*AgentLogsResponse) sealed() {} +func (*PBMSwitchPITRRequest) sealed() {} +func (*PBMSwitchPITRResponse) sealed() {} func (*Ping) sealed() {} func (*Pong) sealed() {} func (*QANCollectRequest) sealed() {} func (*QANCollectResponse) sealed() {} +func (*ServiceInfoRequest) sealed() {} +func (*ServiceInfoResponse) sealed() {} func (*SetStateRequest) sealed() {} func (*SetStateResponse) sealed() {} func (*StartActionRequest) sealed() {} @@ -225,10 +239,6 @@ func (*StopActionRequest) sealed() {} func (*StopActionResponse) sealed() {} func (*StopJobRequest) sealed() {} func (*StopJobResponse) sealed() {} -func (*GetVersionsRequest) sealed() {} -func (*GetVersionsResponse) sealed() {} -func (*PBMSwitchPITRRequest) sealed() {} -func (*PBMSwitchPITRResponse) sealed() {} // check interfaces. var ( @@ -251,6 +261,7 @@ var ( _ AgentResponsePayload = (*JobStatusResponse)(nil) _ AgentResponsePayload = (*GetVersionsResponse)(nil) _ AgentResponsePayload = (*AgentLogsResponse)(nil) + _ AgentResponsePayload = (*ServiceInfoResponse)(nil) // A list of ServerMessage response payloads. _ ServerResponsePayload = (*Pong)(nil) @@ -270,6 +281,7 @@ var ( _ ServerRequestPayload = (*GetVersionsRequest)(nil) _ ServerRequestPayload = (*PBMSwitchPITRRequest)(nil) _ ServerRequestPayload = (*AgentLogsRequest)(nil) + _ ServerRequestPayload = (*ServiceInfoRequest)(nil) ) //go-sumtype:decl AgentParams diff --git a/api/agentpb/agent.pb.go b/api/agentpb/agent.pb.go index 81d6fde6bb..6074a9d2ac 100644 --- a/api/agentpb/agent.pb.go +++ b/api/agentpb/agent.pb.go @@ -1921,14 +1921,15 @@ func (x *CheckConnectionRequest) GetTlsSkipVerify() bool { return false } -// CheckConnectionResponse is an AgentMessage containing a result of connection check. +// CheckConnectionResponse is an AgentMessage containing the result of a connection check. type CheckConnectionResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Error message if connection check failed. - Error string `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` + Error string `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` + // Deprecated: Marked as deprecated in agentpb/agent.proto. Stats *CheckConnectionResponse_Stats `protobuf:"bytes,2,opt,name=stats,proto3" json:"stats,omitempty"` } @@ -1971,6 +1972,7 @@ func (x *CheckConnectionResponse) GetError() string { return "" } +// Deprecated: Marked as deprecated in agentpb/agent.proto. func (x *CheckConnectionResponse) GetStats() *CheckConnectionResponse_Stats { if x != nil { return x.Stats @@ -1978,6 +1980,158 @@ func (x *CheckConnectionResponse) GetStats() *CheckConnectionResponse_Stats { return nil } +// ServiceInfoRequest is a ServerMessage that queries pmm-agent for database information. +type ServiceInfoRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Service type. + Type inventorypb.ServiceType `protobuf:"varint,1,opt,name=type,proto3,enum=inventory.ServiceType" json:"type,omitempty"` + // DSN for the service. May contain connection (dial) timeout. + Dsn string `protobuf:"bytes,2,opt,name=dsn,proto3" json:"dsn,omitempty"` + // Timeout for the whole request. + Timeout *durationpb.Duration `protobuf:"bytes,3,opt,name=timeout,proto3" json:"timeout,omitempty"` + // Contains files and their contents which can be used in DSN. + TextFiles *TextFiles `protobuf:"bytes,4,opt,name=text_files,json=textFiles,proto3" json:"text_files,omitempty"` + // TLS certificate wont be verified. + TlsSkipVerify bool `protobuf:"varint,5,opt,name=tls_skip_verify,json=tlsSkipVerify,proto3" json:"tls_skip_verify,omitempty"` +} + +func (x *ServiceInfoRequest) Reset() { + *x = ServiceInfoRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_agentpb_agent_proto_msgTypes[26] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ServiceInfoRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ServiceInfoRequest) ProtoMessage() {} + +func (x *ServiceInfoRequest) ProtoReflect() protoreflect.Message { + mi := &file_agentpb_agent_proto_msgTypes[26] + 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 ServiceInfoRequest.ProtoReflect.Descriptor instead. +func (*ServiceInfoRequest) Descriptor() ([]byte, []int) { + return file_agentpb_agent_proto_rawDescGZIP(), []int{26} +} + +func (x *ServiceInfoRequest) GetType() inventorypb.ServiceType { + if x != nil { + return x.Type + } + return inventorypb.ServiceType(0) +} + +func (x *ServiceInfoRequest) GetDsn() string { + if x != nil { + return x.Dsn + } + return "" +} + +func (x *ServiceInfoRequest) GetTimeout() *durationpb.Duration { + if x != nil { + return x.Timeout + } + return nil +} + +func (x *ServiceInfoRequest) GetTextFiles() *TextFiles { + if x != nil { + return x.TextFiles + } + return nil +} + +func (x *ServiceInfoRequest) GetTlsSkipVerify() bool { + if x != nil { + return x.TlsSkipVerify + } + return false +} + +// ServiceInfoResponse is an AgentMessage containing information gathered from a service. +type ServiceInfoResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Error message if the request failed. + Error string `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` + // A number of MySQL tables, 0 if unknown. + TableCount int32 `protobuf:"varint,2,opt,name=table_count,json=tableCount,proto3" json:"table_count,omitempty"` + // Database server version. + Version string `protobuf:"bytes,3,opt,name=version,proto3" json:"version,omitempty"` +} + +func (x *ServiceInfoResponse) Reset() { + *x = ServiceInfoResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_agentpb_agent_proto_msgTypes[27] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ServiceInfoResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ServiceInfoResponse) ProtoMessage() {} + +func (x *ServiceInfoResponse) ProtoReflect() protoreflect.Message { + mi := &file_agentpb_agent_proto_msgTypes[27] + 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 ServiceInfoResponse.ProtoReflect.Descriptor instead. +func (*ServiceInfoResponse) Descriptor() ([]byte, []int) { + return file_agentpb_agent_proto_rawDescGZIP(), []int{27} +} + +func (x *ServiceInfoResponse) GetError() string { + if x != nil { + return x.Error + } + return "" +} + +func (x *ServiceInfoResponse) GetTableCount() int32 { + if x != nil { + return x.TableCount + } + return 0 +} + +func (x *ServiceInfoResponse) GetVersion() string { + if x != nil { + return x.Version + } + return "" +} + // JobStatusRequest is a ServerMessage asking pmm-agent for job status. type JobStatusRequest struct { state protoimpl.MessageState @@ -1990,7 +2144,7 @@ type JobStatusRequest struct { func (x *JobStatusRequest) Reset() { *x = JobStatusRequest{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[26] + mi := &file_agentpb_agent_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2003,7 +2157,7 @@ func (x *JobStatusRequest) String() string { func (*JobStatusRequest) ProtoMessage() {} func (x *JobStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[26] + mi := &file_agentpb_agent_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2016,7 +2170,7 @@ func (x *JobStatusRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use JobStatusRequest.ProtoReflect.Descriptor instead. func (*JobStatusRequest) Descriptor() ([]byte, []int) { - return file_agentpb_agent_proto_rawDescGZIP(), []int{26} + return file_agentpb_agent_proto_rawDescGZIP(), []int{28} } func (x *JobStatusRequest) GetJobId() string { @@ -2038,7 +2192,7 @@ type JobStatusResponse struct { func (x *JobStatusResponse) Reset() { *x = JobStatusResponse{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[27] + mi := &file_agentpb_agent_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2051,7 +2205,7 @@ func (x *JobStatusResponse) String() string { func (*JobStatusResponse) ProtoMessage() {} func (x *JobStatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[27] + mi := &file_agentpb_agent_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2064,7 +2218,7 @@ func (x *JobStatusResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use JobStatusResponse.ProtoReflect.Descriptor instead. func (*JobStatusResponse) Descriptor() ([]byte, []int) { - return file_agentpb_agent_proto_rawDescGZIP(), []int{27} + return file_agentpb_agent_proto_rawDescGZIP(), []int{29} } func (x *JobStatusResponse) GetAlive() bool { @@ -2090,7 +2244,7 @@ type S3LocationConfig struct { func (x *S3LocationConfig) Reset() { *x = S3LocationConfig{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[28] + mi := &file_agentpb_agent_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2103,7 +2257,7 @@ func (x *S3LocationConfig) String() string { func (*S3LocationConfig) ProtoMessage() {} func (x *S3LocationConfig) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[28] + mi := &file_agentpb_agent_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2116,7 +2270,7 @@ func (x *S3LocationConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use S3LocationConfig.ProtoReflect.Descriptor instead. func (*S3LocationConfig) Descriptor() ([]byte, []int) { - return file_agentpb_agent_proto_rawDescGZIP(), []int{28} + return file_agentpb_agent_proto_rawDescGZIP(), []int{30} } func (x *S3LocationConfig) GetEndpoint() string { @@ -2166,7 +2320,7 @@ type FilesystemLocationConfig struct { func (x *FilesystemLocationConfig) Reset() { *x = FilesystemLocationConfig{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[29] + mi := &file_agentpb_agent_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2179,7 +2333,7 @@ func (x *FilesystemLocationConfig) String() string { func (*FilesystemLocationConfig) ProtoMessage() {} func (x *FilesystemLocationConfig) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[29] + mi := &file_agentpb_agent_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2192,7 +2346,7 @@ func (x *FilesystemLocationConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use FilesystemLocationConfig.ProtoReflect.Descriptor instead. func (*FilesystemLocationConfig) Descriptor() ([]byte, []int) { - return file_agentpb_agent_proto_rawDescGZIP(), []int{29} + return file_agentpb_agent_proto_rawDescGZIP(), []int{31} } func (x *FilesystemLocationConfig) GetPath() string { @@ -2223,7 +2377,7 @@ type StartJobRequest struct { func (x *StartJobRequest) Reset() { *x = StartJobRequest{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[30] + mi := &file_agentpb_agent_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2236,7 +2390,7 @@ func (x *StartJobRequest) String() string { func (*StartJobRequest) ProtoMessage() {} func (x *StartJobRequest) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[30] + mi := &file_agentpb_agent_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2249,7 +2403,7 @@ func (x *StartJobRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use StartJobRequest.ProtoReflect.Descriptor instead. func (*StartJobRequest) Descriptor() ([]byte, []int) { - return file_agentpb_agent_proto_rawDescGZIP(), []int{30} + return file_agentpb_agent_proto_rawDescGZIP(), []int{32} } func (x *StartJobRequest) GetJobId() string { @@ -2341,7 +2495,7 @@ type StartJobResponse struct { func (x *StartJobResponse) Reset() { *x = StartJobResponse{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[31] + mi := &file_agentpb_agent_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2354,7 +2508,7 @@ func (x *StartJobResponse) String() string { func (*StartJobResponse) ProtoMessage() {} func (x *StartJobResponse) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[31] + mi := &file_agentpb_agent_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2367,7 +2521,7 @@ func (x *StartJobResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use StartJobResponse.ProtoReflect.Descriptor instead. func (*StartJobResponse) Descriptor() ([]byte, []int) { - return file_agentpb_agent_proto_rawDescGZIP(), []int{31} + return file_agentpb_agent_proto_rawDescGZIP(), []int{33} } func (x *StartJobResponse) GetError() string { @@ -2389,7 +2543,7 @@ type StopJobRequest struct { func (x *StopJobRequest) Reset() { *x = StopJobRequest{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[32] + mi := &file_agentpb_agent_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2402,7 +2556,7 @@ func (x *StopJobRequest) String() string { func (*StopJobRequest) ProtoMessage() {} func (x *StopJobRequest) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[32] + mi := &file_agentpb_agent_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2415,7 +2569,7 @@ func (x *StopJobRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use StopJobRequest.ProtoReflect.Descriptor instead. func (*StopJobRequest) Descriptor() ([]byte, []int) { - return file_agentpb_agent_proto_rawDescGZIP(), []int{32} + return file_agentpb_agent_proto_rawDescGZIP(), []int{34} } func (x *StopJobRequest) GetJobId() string { @@ -2435,7 +2589,7 @@ type StopJobResponse struct { func (x *StopJobResponse) Reset() { *x = StopJobResponse{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[33] + mi := &file_agentpb_agent_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2448,7 +2602,7 @@ func (x *StopJobResponse) String() string { func (*StopJobResponse) ProtoMessage() {} func (x *StopJobResponse) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[33] + mi := &file_agentpb_agent_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2461,7 +2615,7 @@ func (x *StopJobResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use StopJobResponse.ProtoReflect.Descriptor instead. func (*StopJobResponse) Descriptor() ([]byte, []int) { - return file_agentpb_agent_proto_rawDescGZIP(), []int{33} + return file_agentpb_agent_proto_rawDescGZIP(), []int{35} } // JobResult represents job result. @@ -2485,7 +2639,7 @@ type JobResult struct { func (x *JobResult) Reset() { *x = JobResult{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[34] + mi := &file_agentpb_agent_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2498,7 +2652,7 @@ func (x *JobResult) String() string { func (*JobResult) ProtoMessage() {} func (x *JobResult) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[34] + mi := &file_agentpb_agent_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2511,7 +2665,7 @@ func (x *JobResult) ProtoReflect() protoreflect.Message { // Deprecated: Use JobResult.ProtoReflect.Descriptor instead. func (*JobResult) Descriptor() ([]byte, []int) { - return file_agentpb_agent_proto_rawDescGZIP(), []int{34} + return file_agentpb_agent_proto_rawDescGZIP(), []int{36} } func (x *JobResult) GetJobId() string { @@ -2623,7 +2777,7 @@ type JobProgress struct { func (x *JobProgress) Reset() { *x = JobProgress{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[35] + mi := &file_agentpb_agent_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2636,7 +2790,7 @@ func (x *JobProgress) String() string { func (*JobProgress) ProtoMessage() {} func (x *JobProgress) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[35] + mi := &file_agentpb_agent_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2649,7 +2803,7 @@ func (x *JobProgress) ProtoReflect() protoreflect.Message { // Deprecated: Use JobProgress.ProtoReflect.Descriptor instead. func (*JobProgress) Descriptor() ([]byte, []int) { - return file_agentpb_agent_proto_rawDescGZIP(), []int{35} + return file_agentpb_agent_proto_rawDescGZIP(), []int{37} } func (x *JobProgress) GetJobId() string { @@ -2728,7 +2882,7 @@ type GetVersionsRequest struct { func (x *GetVersionsRequest) Reset() { *x = GetVersionsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[36] + mi := &file_agentpb_agent_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2741,7 +2895,7 @@ func (x *GetVersionsRequest) String() string { func (*GetVersionsRequest) ProtoMessage() {} func (x *GetVersionsRequest) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[36] + mi := &file_agentpb_agent_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2754,7 +2908,7 @@ func (x *GetVersionsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetVersionsRequest.ProtoReflect.Descriptor instead. func (*GetVersionsRequest) Descriptor() ([]byte, []int) { - return file_agentpb_agent_proto_rawDescGZIP(), []int{36} + return file_agentpb_agent_proto_rawDescGZIP(), []int{38} } func (x *GetVersionsRequest) GetSoftwares() []*GetVersionsRequest_Software { @@ -2776,7 +2930,7 @@ type GetVersionsResponse struct { func (x *GetVersionsResponse) Reset() { *x = GetVersionsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[37] + mi := &file_agentpb_agent_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2789,7 +2943,7 @@ func (x *GetVersionsResponse) String() string { func (*GetVersionsResponse) ProtoMessage() {} func (x *GetVersionsResponse) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[37] + mi := &file_agentpb_agent_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2802,7 +2956,7 @@ func (x *GetVersionsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetVersionsResponse.ProtoReflect.Descriptor instead. func (*GetVersionsResponse) Descriptor() ([]byte, []int) { - return file_agentpb_agent_proto_rawDescGZIP(), []int{37} + return file_agentpb_agent_proto_rawDescGZIP(), []int{39} } func (x *GetVersionsResponse) GetVersions() []*GetVersionsResponse_Version { @@ -2843,13 +2997,14 @@ type AgentMessage struct { // *AgentMessage_GetVersions // *AgentMessage_PbmSwitchPitr // *AgentMessage_AgentLogs + // *AgentMessage_ServiceInfo Payload isAgentMessage_Payload `protobuf_oneof:"payload"` } func (x *AgentMessage) Reset() { *x = AgentMessage{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[38] + mi := &file_agentpb_agent_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2862,7 +3017,7 @@ func (x *AgentMessage) String() string { func (*AgentMessage) ProtoMessage() {} func (x *AgentMessage) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[38] + mi := &file_agentpb_agent_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2875,7 +3030,7 @@ func (x *AgentMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use AgentMessage.ProtoReflect.Descriptor instead. func (*AgentMessage) Descriptor() ([]byte, []int) { - return file_agentpb_agent_proto_rawDescGZIP(), []int{38} + return file_agentpb_agent_proto_rawDescGZIP(), []int{40} } func (x *AgentMessage) GetId() uint32 { @@ -3018,6 +3173,13 @@ func (x *AgentMessage) GetAgentLogs() *AgentLogsResponse { return nil } +func (x *AgentMessage) GetServiceInfo() *ServiceInfoResponse { + if x, ok := x.GetPayload().(*AgentMessage_ServiceInfo); ok { + return x.ServiceInfo + } + return nil +} + type isAgentMessage_Payload interface { isAgentMessage_Payload() } @@ -3092,6 +3254,10 @@ type AgentMessage_AgentLogs struct { AgentLogs *AgentLogsResponse `protobuf:"bytes,21,opt,name=agent_logs,json=agentLogs,proto3,oneof"` } +type AgentMessage_ServiceInfo struct { + ServiceInfo *ServiceInfoResponse `protobuf:"bytes,22,opt,name=service_info,json=serviceInfo,proto3,oneof"` +} + func (*AgentMessage_Ping) isAgentMessage_Payload() {} func (*AgentMessage_StateChanged) isAgentMessage_Payload() {} @@ -3126,6 +3292,8 @@ func (*AgentMessage_PbmSwitchPitr) isAgentMessage_Payload() {} func (*AgentMessage_AgentLogs) isAgentMessage_Payload() {} +func (*AgentMessage_ServiceInfo) isAgentMessage_Payload() {} + type ServerMessage struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3155,13 +3323,14 @@ type ServerMessage struct { // *ServerMessage_GetVersions // *ServerMessage_PbmSwitchPitr // *ServerMessage_AgentLogs + // *ServerMessage_ServiceInfo Payload isServerMessage_Payload `protobuf_oneof:"payload"` } func (x *ServerMessage) Reset() { *x = ServerMessage{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[39] + mi := &file_agentpb_agent_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3174,7 +3343,7 @@ func (x *ServerMessage) String() string { func (*ServerMessage) ProtoMessage() {} func (x *ServerMessage) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[39] + mi := &file_agentpb_agent_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3187,7 +3356,7 @@ func (x *ServerMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use ServerMessage.ProtoReflect.Descriptor instead. func (*ServerMessage) Descriptor() ([]byte, []int) { - return file_agentpb_agent_proto_rawDescGZIP(), []int{39} + return file_agentpb_agent_proto_rawDescGZIP(), []int{41} } func (x *ServerMessage) GetId() uint32 { @@ -3316,6 +3485,13 @@ func (x *ServerMessage) GetAgentLogs() *AgentLogsRequest { return nil } +func (x *ServerMessage) GetServiceInfo() *ServiceInfoRequest { + if x, ok := x.GetPayload().(*ServerMessage_ServiceInfo); ok { + return x.ServiceInfo + } + return nil +} + type isServerMessage_Payload interface { isServerMessage_Payload() } @@ -3382,6 +3558,10 @@ type ServerMessage_AgentLogs struct { AgentLogs *AgentLogsRequest `protobuf:"bytes,19,opt,name=agent_logs,json=agentLogs,proto3,oneof"` } +type ServerMessage_ServiceInfo struct { + ServiceInfo *ServiceInfoRequest `protobuf:"bytes,20,opt,name=service_info,json=serviceInfo,proto3,oneof"` +} + func (*ServerMessage_Pong) isServerMessage_Payload() {} func (*ServerMessage_StateChanged) isServerMessage_Payload() {} @@ -3412,6 +3592,8 @@ func (*ServerMessage_PbmSwitchPitr) isServerMessage_Payload() {} func (*ServerMessage_AgentLogs) isServerMessage_Payload() {} +func (*ServerMessage_ServiceInfo) isServerMessage_Payload() {} + // AgentProcess describes desired configuration of a single agent process started by pmm-agent. type SetStateRequest_AgentProcess struct { state protoimpl.MessageState @@ -3430,7 +3612,7 @@ type SetStateRequest_AgentProcess struct { func (x *SetStateRequest_AgentProcess) Reset() { *x = SetStateRequest_AgentProcess{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[41] + mi := &file_agentpb_agent_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3443,7 +3625,7 @@ func (x *SetStateRequest_AgentProcess) String() string { func (*SetStateRequest_AgentProcess) ProtoMessage() {} func (x *SetStateRequest_AgentProcess) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[41] + mi := &file_agentpb_agent_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3535,7 +3717,7 @@ type SetStateRequest_BuiltinAgent struct { func (x *SetStateRequest_BuiltinAgent) Reset() { *x = SetStateRequest_BuiltinAgent{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[43] + mi := &file_agentpb_agent_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3548,7 +3730,7 @@ func (x *SetStateRequest_BuiltinAgent) String() string { func (*SetStateRequest_BuiltinAgent) ProtoMessage() {} func (x *SetStateRequest_BuiltinAgent) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[43] + mi := &file_agentpb_agent_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3648,7 +3830,7 @@ type StartActionRequest_MySQLExplainParams struct { func (x *StartActionRequest_MySQLExplainParams) Reset() { *x = StartActionRequest_MySQLExplainParams{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[47] + mi := &file_agentpb_agent_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3661,7 +3843,7 @@ func (x *StartActionRequest_MySQLExplainParams) String() string { func (*StartActionRequest_MySQLExplainParams) ProtoMessage() {} func (x *StartActionRequest_MySQLExplainParams) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[47] + mi := &file_agentpb_agent_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3744,7 +3926,7 @@ type StartActionRequest_MySQLShowCreateTableParams struct { func (x *StartActionRequest_MySQLShowCreateTableParams) Reset() { *x = StartActionRequest_MySQLShowCreateTableParams{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[48] + mi := &file_agentpb_agent_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3757,7 +3939,7 @@ func (x *StartActionRequest_MySQLShowCreateTableParams) String() string { func (*StartActionRequest_MySQLShowCreateTableParams) ProtoMessage() {} func (x *StartActionRequest_MySQLShowCreateTableParams) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[48] + mi := &file_agentpb_agent_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3819,7 +4001,7 @@ type StartActionRequest_MySQLShowTableStatusParams struct { func (x *StartActionRequest_MySQLShowTableStatusParams) Reset() { *x = StartActionRequest_MySQLShowTableStatusParams{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[49] + mi := &file_agentpb_agent_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3832,7 +4014,7 @@ func (x *StartActionRequest_MySQLShowTableStatusParams) String() string { func (*StartActionRequest_MySQLShowTableStatusParams) ProtoMessage() {} func (x *StartActionRequest_MySQLShowTableStatusParams) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[49] + mi := &file_agentpb_agent_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3894,7 +4076,7 @@ type StartActionRequest_MySQLShowIndexParams struct { func (x *StartActionRequest_MySQLShowIndexParams) Reset() { *x = StartActionRequest_MySQLShowIndexParams{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[50] + mi := &file_agentpb_agent_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3907,7 +4089,7 @@ func (x *StartActionRequest_MySQLShowIndexParams) String() string { func (*StartActionRequest_MySQLShowIndexParams) ProtoMessage() {} func (x *StartActionRequest_MySQLShowIndexParams) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[50] + mi := &file_agentpb_agent_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3969,7 +4151,7 @@ type StartActionRequest_PostgreSQLShowCreateTableParams struct { func (x *StartActionRequest_PostgreSQLShowCreateTableParams) Reset() { *x = StartActionRequest_PostgreSQLShowCreateTableParams{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[51] + mi := &file_agentpb_agent_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3982,7 +4164,7 @@ func (x *StartActionRequest_PostgreSQLShowCreateTableParams) String() string { func (*StartActionRequest_PostgreSQLShowCreateTableParams) ProtoMessage() {} func (x *StartActionRequest_PostgreSQLShowCreateTableParams) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[51] + mi := &file_agentpb_agent_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4044,7 +4226,7 @@ type StartActionRequest_PostgreSQLShowIndexParams struct { func (x *StartActionRequest_PostgreSQLShowIndexParams) Reset() { *x = StartActionRequest_PostgreSQLShowIndexParams{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[52] + mi := &file_agentpb_agent_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4057,7 +4239,7 @@ func (x *StartActionRequest_PostgreSQLShowIndexParams) String() string { func (*StartActionRequest_PostgreSQLShowIndexParams) ProtoMessage() {} func (x *StartActionRequest_PostgreSQLShowIndexParams) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[52] + mi := &file_agentpb_agent_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4118,7 +4300,7 @@ type StartActionRequest_MongoDBExplainParams struct { func (x *StartActionRequest_MongoDBExplainParams) Reset() { *x = StartActionRequest_MongoDBExplainParams{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[53] + mi := &file_agentpb_agent_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4131,7 +4313,7 @@ func (x *StartActionRequest_MongoDBExplainParams) String() string { func (*StartActionRequest_MongoDBExplainParams) ProtoMessage() {} func (x *StartActionRequest_MongoDBExplainParams) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[53] + mi := &file_agentpb_agent_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4178,7 +4360,7 @@ type StartActionRequest_PTSummaryParams struct { func (x *StartActionRequest_PTSummaryParams) Reset() { *x = StartActionRequest_PTSummaryParams{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[54] + mi := &file_agentpb_agent_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4191,7 +4373,7 @@ func (x *StartActionRequest_PTSummaryParams) String() string { func (*StartActionRequest_PTSummaryParams) ProtoMessage() {} func (x *StartActionRequest_PTSummaryParams) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[54] + mi := &file_agentpb_agent_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4222,7 +4404,7 @@ type StartActionRequest_PTPgSummaryParams struct { func (x *StartActionRequest_PTPgSummaryParams) Reset() { *x = StartActionRequest_PTPgSummaryParams{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[55] + mi := &file_agentpb_agent_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4235,7 +4417,7 @@ func (x *StartActionRequest_PTPgSummaryParams) String() string { func (*StartActionRequest_PTPgSummaryParams) ProtoMessage() {} func (x *StartActionRequest_PTPgSummaryParams) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[55] + mi := &file_agentpb_agent_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4294,7 +4476,7 @@ type StartActionRequest_PTMongoDBSummaryParams struct { func (x *StartActionRequest_PTMongoDBSummaryParams) Reset() { *x = StartActionRequest_PTMongoDBSummaryParams{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[56] + mi := &file_agentpb_agent_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4307,7 +4489,7 @@ func (x *StartActionRequest_PTMongoDBSummaryParams) String() string { func (*StartActionRequest_PTMongoDBSummaryParams) ProtoMessage() {} func (x *StartActionRequest_PTMongoDBSummaryParams) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[56] + mi := &file_agentpb_agent_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4367,7 +4549,7 @@ type StartActionRequest_PTMySQLSummaryParams struct { func (x *StartActionRequest_PTMySQLSummaryParams) Reset() { *x = StartActionRequest_PTMySQLSummaryParams{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[57] + mi := &file_agentpb_agent_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4380,7 +4562,7 @@ func (x *StartActionRequest_PTMySQLSummaryParams) String() string { func (*StartActionRequest_PTMySQLSummaryParams) ProtoMessage() {} func (x *StartActionRequest_PTMySQLSummaryParams) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[57] + mi := &file_agentpb_agent_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4450,7 +4632,7 @@ type StartActionRequest_MySQLQueryShowParams struct { func (x *StartActionRequest_MySQLQueryShowParams) Reset() { *x = StartActionRequest_MySQLQueryShowParams{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[58] + mi := &file_agentpb_agent_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4463,7 +4645,7 @@ func (x *StartActionRequest_MySQLQueryShowParams) String() string { func (*StartActionRequest_MySQLQueryShowParams) ProtoMessage() {} func (x *StartActionRequest_MySQLQueryShowParams) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[58] + mi := &file_agentpb_agent_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4526,7 +4708,7 @@ type StartActionRequest_MySQLQuerySelectParams struct { func (x *StartActionRequest_MySQLQuerySelectParams) Reset() { *x = StartActionRequest_MySQLQuerySelectParams{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[59] + mi := &file_agentpb_agent_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4539,7 +4721,7 @@ func (x *StartActionRequest_MySQLQuerySelectParams) String() string { func (*StartActionRequest_MySQLQuerySelectParams) ProtoMessage() {} func (x *StartActionRequest_MySQLQuerySelectParams) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[59] + mi := &file_agentpb_agent_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4600,7 +4782,7 @@ type StartActionRequest_PostgreSQLQueryShowParams struct { func (x *StartActionRequest_PostgreSQLQueryShowParams) Reset() { *x = StartActionRequest_PostgreSQLQueryShowParams{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[60] + mi := &file_agentpb_agent_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4613,7 +4795,7 @@ func (x *StartActionRequest_PostgreSQLQueryShowParams) String() string { func (*StartActionRequest_PostgreSQLQueryShowParams) ProtoMessage() {} func (x *StartActionRequest_PostgreSQLQueryShowParams) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[60] + mi := &file_agentpb_agent_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4669,7 +4851,7 @@ type StartActionRequest_PostgreSQLQuerySelectParams struct { func (x *StartActionRequest_PostgreSQLQuerySelectParams) Reset() { *x = StartActionRequest_PostgreSQLQuerySelectParams{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[61] + mi := &file_agentpb_agent_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4682,7 +4864,7 @@ func (x *StartActionRequest_PostgreSQLQuerySelectParams) String() string { func (*StartActionRequest_PostgreSQLQuerySelectParams) ProtoMessage() {} func (x *StartActionRequest_PostgreSQLQuerySelectParams) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[61] + mi := &file_agentpb_agent_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4742,7 +4924,7 @@ type StartActionRequest_MongoDBQueryGetParameterParams struct { func (x *StartActionRequest_MongoDBQueryGetParameterParams) Reset() { *x = StartActionRequest_MongoDBQueryGetParameterParams{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[62] + mi := &file_agentpb_agent_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4755,7 +4937,7 @@ func (x *StartActionRequest_MongoDBQueryGetParameterParams) String() string { func (*StartActionRequest_MongoDBQueryGetParameterParams) ProtoMessage() {} func (x *StartActionRequest_MongoDBQueryGetParameterParams) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[62] + mi := &file_agentpb_agent_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4801,7 +4983,7 @@ type StartActionRequest_MongoDBQueryBuildInfoParams struct { func (x *StartActionRequest_MongoDBQueryBuildInfoParams) Reset() { *x = StartActionRequest_MongoDBQueryBuildInfoParams{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[63] + mi := &file_agentpb_agent_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4814,7 +4996,7 @@ func (x *StartActionRequest_MongoDBQueryBuildInfoParams) String() string { func (*StartActionRequest_MongoDBQueryBuildInfoParams) ProtoMessage() {} func (x *StartActionRequest_MongoDBQueryBuildInfoParams) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[63] + mi := &file_agentpb_agent_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4860,7 +5042,7 @@ type StartActionRequest_MongoDBQueryGetCmdLineOptsParams struct { func (x *StartActionRequest_MongoDBQueryGetCmdLineOptsParams) Reset() { *x = StartActionRequest_MongoDBQueryGetCmdLineOptsParams{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[64] + mi := &file_agentpb_agent_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4873,7 +5055,7 @@ func (x *StartActionRequest_MongoDBQueryGetCmdLineOptsParams) String() string { func (*StartActionRequest_MongoDBQueryGetCmdLineOptsParams) ProtoMessage() {} func (x *StartActionRequest_MongoDBQueryGetCmdLineOptsParams) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[64] + mi := &file_agentpb_agent_proto_msgTypes[66] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4919,7 +5101,7 @@ type StartActionRequest_MongoDBQueryReplSetGetStatusParams struct { func (x *StartActionRequest_MongoDBQueryReplSetGetStatusParams) Reset() { *x = StartActionRequest_MongoDBQueryReplSetGetStatusParams{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[65] + mi := &file_agentpb_agent_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4932,7 +5114,7 @@ func (x *StartActionRequest_MongoDBQueryReplSetGetStatusParams) String() string func (*StartActionRequest_MongoDBQueryReplSetGetStatusParams) ProtoMessage() {} func (x *StartActionRequest_MongoDBQueryReplSetGetStatusParams) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[65] + mi := &file_agentpb_agent_proto_msgTypes[67] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4978,7 +5160,7 @@ type StartActionRequest_MongoDBQueryGetDiagnosticDataParams struct { func (x *StartActionRequest_MongoDBQueryGetDiagnosticDataParams) Reset() { *x = StartActionRequest_MongoDBQueryGetDiagnosticDataParams{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[66] + mi := &file_agentpb_agent_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4991,7 +5173,7 @@ func (x *StartActionRequest_MongoDBQueryGetDiagnosticDataParams) String() string func (*StartActionRequest_MongoDBQueryGetDiagnosticDataParams) ProtoMessage() {} func (x *StartActionRequest_MongoDBQueryGetDiagnosticDataParams) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[66] + mi := &file_agentpb_agent_proto_msgTypes[68] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5033,7 +5215,7 @@ type StartActionRequest_RestartSystemServiceParams struct { func (x *StartActionRequest_RestartSystemServiceParams) Reset() { *x = StartActionRequest_RestartSystemServiceParams{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[67] + mi := &file_agentpb_agent_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5046,7 +5228,7 @@ func (x *StartActionRequest_RestartSystemServiceParams) String() string { func (*StartActionRequest_RestartSystemServiceParams) ProtoMessage() {} func (x *StartActionRequest_RestartSystemServiceParams) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[67] + mi := &file_agentpb_agent_proto_msgTypes[69] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5076,13 +5258,14 @@ type CheckConnectionResponse_Stats struct { unknownFields protoimpl.UnknownFields // A number of tables, 0 if unknown. - TableCount int32 `protobuf:"varint,1,opt,name=table_count,json=tableCount,proto3" json:"table_count,omitempty"` + TableCount int32 `protobuf:"varint,1,opt,name=table_count,json=tableCount,proto3" json:"table_count,omitempty"` + Version string `protobuf:"bytes,2,opt,name=version,proto3" json:"version,omitempty"` } func (x *CheckConnectionResponse_Stats) Reset() { *x = CheckConnectionResponse_Stats{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[68] + mi := &file_agentpb_agent_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5095,7 +5278,7 @@ func (x *CheckConnectionResponse_Stats) String() string { func (*CheckConnectionResponse_Stats) ProtoMessage() {} func (x *CheckConnectionResponse_Stats) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[68] + mi := &file_agentpb_agent_proto_msgTypes[70] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5118,6 +5301,13 @@ func (x *CheckConnectionResponse_Stats) GetTableCount() int32 { return 0 } +func (x *CheckConnectionResponse_Stats) GetVersion() string { + if x != nil { + return x.Version + } + return "" +} + // MySQLBackup is job for backup MySQL service. type StartJobRequest_MySQLBackup struct { state protoimpl.MessageState @@ -5149,7 +5339,7 @@ type StartJobRequest_MySQLBackup struct { func (x *StartJobRequest_MySQLBackup) Reset() { *x = StartJobRequest_MySQLBackup{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[69] + mi := &file_agentpb_agent_proto_msgTypes[71] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5162,7 +5352,7 @@ func (x *StartJobRequest_MySQLBackup) String() string { func (*StartJobRequest_MySQLBackup) ProtoMessage() {} func (x *StartJobRequest_MySQLBackup) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[69] + mi := &file_agentpb_agent_proto_msgTypes[71] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5175,7 +5365,7 @@ func (x *StartJobRequest_MySQLBackup) ProtoReflect() protoreflect.Message { // Deprecated: Use StartJobRequest_MySQLBackup.ProtoReflect.Descriptor instead. func (*StartJobRequest_MySQLBackup) Descriptor() ([]byte, []int) { - return file_agentpb_agent_proto_rawDescGZIP(), []int{30, 0} + return file_agentpb_agent_proto_rawDescGZIP(), []int{32, 0} } func (x *StartJobRequest_MySQLBackup) GetUser() string { @@ -5274,7 +5464,7 @@ type StartJobRequest_MySQLRestoreBackup struct { func (x *StartJobRequest_MySQLRestoreBackup) Reset() { *x = StartJobRequest_MySQLRestoreBackup{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[70] + mi := &file_agentpb_agent_proto_msgTypes[72] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5287,7 +5477,7 @@ func (x *StartJobRequest_MySQLRestoreBackup) String() string { func (*StartJobRequest_MySQLRestoreBackup) ProtoMessage() {} func (x *StartJobRequest_MySQLRestoreBackup) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[70] + mi := &file_agentpb_agent_proto_msgTypes[72] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5300,7 +5490,7 @@ func (x *StartJobRequest_MySQLRestoreBackup) ProtoReflect() protoreflect.Message // Deprecated: Use StartJobRequest_MySQLRestoreBackup.ProtoReflect.Descriptor instead. func (*StartJobRequest_MySQLRestoreBackup) Descriptor() ([]byte, []int) { - return file_agentpb_agent_proto_rawDescGZIP(), []int{30, 1} + return file_agentpb_agent_proto_rawDescGZIP(), []int{32, 1} } func (x *StartJobRequest_MySQLRestoreBackup) GetServiceId() string { @@ -5400,7 +5590,7 @@ type StartJobRequest_MongoDBBackup struct { func (x *StartJobRequest_MongoDBBackup) Reset() { *x = StartJobRequest_MongoDBBackup{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[71] + mi := &file_agentpb_agent_proto_msgTypes[73] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5413,7 +5603,7 @@ func (x *StartJobRequest_MongoDBBackup) String() string { func (*StartJobRequest_MongoDBBackup) ProtoMessage() {} func (x *StartJobRequest_MongoDBBackup) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[71] + mi := &file_agentpb_agent_proto_msgTypes[73] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5426,7 +5616,7 @@ func (x *StartJobRequest_MongoDBBackup) ProtoReflect() protoreflect.Message { // Deprecated: Use StartJobRequest_MongoDBBackup.ProtoReflect.Descriptor instead. func (*StartJobRequest_MongoDBBackup) Descriptor() ([]byte, []int) { - return file_agentpb_agent_proto_rawDescGZIP(), []int{30, 2} + return file_agentpb_agent_proto_rawDescGZIP(), []int{32, 2} } // Deprecated: Marked as deprecated in agentpb/agent.proto. @@ -5600,7 +5790,7 @@ type StartJobRequest_MongoDBRestoreBackup struct { func (x *StartJobRequest_MongoDBRestoreBackup) Reset() { *x = StartJobRequest_MongoDBRestoreBackup{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[72] + mi := &file_agentpb_agent_proto_msgTypes[74] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5613,7 +5803,7 @@ func (x *StartJobRequest_MongoDBRestoreBackup) String() string { func (*StartJobRequest_MongoDBRestoreBackup) ProtoMessage() {} func (x *StartJobRequest_MongoDBRestoreBackup) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[72] + mi := &file_agentpb_agent_proto_msgTypes[74] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5626,7 +5816,7 @@ func (x *StartJobRequest_MongoDBRestoreBackup) ProtoReflect() protoreflect.Messa // Deprecated: Use StartJobRequest_MongoDBRestoreBackup.ProtoReflect.Descriptor instead. func (*StartJobRequest_MongoDBRestoreBackup) Descriptor() ([]byte, []int) { - return file_agentpb_agent_proto_rawDescGZIP(), []int{30, 3} + return file_agentpb_agent_proto_rawDescGZIP(), []int{32, 3} } // Deprecated: Marked as deprecated in agentpb/agent.proto. @@ -5762,7 +5952,7 @@ type JobResult_Error struct { func (x *JobResult_Error) Reset() { *x = JobResult_Error{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[73] + mi := &file_agentpb_agent_proto_msgTypes[75] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5775,7 +5965,7 @@ func (x *JobResult_Error) String() string { func (*JobResult_Error) ProtoMessage() {} func (x *JobResult_Error) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[73] + mi := &file_agentpb_agent_proto_msgTypes[75] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5788,7 +5978,7 @@ func (x *JobResult_Error) ProtoReflect() protoreflect.Message { // Deprecated: Use JobResult_Error.ProtoReflect.Descriptor instead. func (*JobResult_Error) Descriptor() ([]byte, []int) { - return file_agentpb_agent_proto_rawDescGZIP(), []int{34, 0} + return file_agentpb_agent_proto_rawDescGZIP(), []int{36, 0} } func (x *JobResult_Error) GetMessage() string { @@ -5812,7 +6002,7 @@ type JobResult_MongoDBBackup struct { func (x *JobResult_MongoDBBackup) Reset() { *x = JobResult_MongoDBBackup{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[74] + mi := &file_agentpb_agent_proto_msgTypes[76] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5825,7 +6015,7 @@ func (x *JobResult_MongoDBBackup) String() string { func (*JobResult_MongoDBBackup) ProtoMessage() {} func (x *JobResult_MongoDBBackup) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[74] + mi := &file_agentpb_agent_proto_msgTypes[76] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5838,7 +6028,7 @@ func (x *JobResult_MongoDBBackup) ProtoReflect() protoreflect.Message { // Deprecated: Use JobResult_MongoDBBackup.ProtoReflect.Descriptor instead. func (*JobResult_MongoDBBackup) Descriptor() ([]byte, []int) { - return file_agentpb_agent_proto_rawDescGZIP(), []int{34, 1} + return file_agentpb_agent_proto_rawDescGZIP(), []int{36, 1} } func (x *JobResult_MongoDBBackup) GetIsShardedCluster() bool { @@ -5868,7 +6058,7 @@ type JobResult_MySQLBackup struct { func (x *JobResult_MySQLBackup) Reset() { *x = JobResult_MySQLBackup{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[75] + mi := &file_agentpb_agent_proto_msgTypes[77] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5881,7 +6071,7 @@ func (x *JobResult_MySQLBackup) String() string { func (*JobResult_MySQLBackup) ProtoMessage() {} func (x *JobResult_MySQLBackup) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[75] + mi := &file_agentpb_agent_proto_msgTypes[77] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5894,7 +6084,7 @@ func (x *JobResult_MySQLBackup) ProtoReflect() protoreflect.Message { // Deprecated: Use JobResult_MySQLBackup.ProtoReflect.Descriptor instead. func (*JobResult_MySQLBackup) Descriptor() ([]byte, []int) { - return file_agentpb_agent_proto_rawDescGZIP(), []int{34, 2} + return file_agentpb_agent_proto_rawDescGZIP(), []int{36, 2} } func (x *JobResult_MySQLBackup) GetMetadata() *backup.Metadata { @@ -5914,7 +6104,7 @@ type JobResult_MySQLRestoreBackup struct { func (x *JobResult_MySQLRestoreBackup) Reset() { *x = JobResult_MySQLRestoreBackup{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[76] + mi := &file_agentpb_agent_proto_msgTypes[78] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5927,7 +6117,7 @@ func (x *JobResult_MySQLRestoreBackup) String() string { func (*JobResult_MySQLRestoreBackup) ProtoMessage() {} func (x *JobResult_MySQLRestoreBackup) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[76] + mi := &file_agentpb_agent_proto_msgTypes[78] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5940,7 +6130,7 @@ func (x *JobResult_MySQLRestoreBackup) ProtoReflect() protoreflect.Message { // Deprecated: Use JobResult_MySQLRestoreBackup.ProtoReflect.Descriptor instead. func (*JobResult_MySQLRestoreBackup) Descriptor() ([]byte, []int) { - return file_agentpb_agent_proto_rawDescGZIP(), []int{34, 3} + return file_agentpb_agent_proto_rawDescGZIP(), []int{36, 3} } // MongoDBRestoreBackup contains result for MongoDB restore backup job. @@ -5953,7 +6143,7 @@ type JobResult_MongoDBRestoreBackup struct { func (x *JobResult_MongoDBRestoreBackup) Reset() { *x = JobResult_MongoDBRestoreBackup{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[77] + mi := &file_agentpb_agent_proto_msgTypes[79] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5966,7 +6156,7 @@ func (x *JobResult_MongoDBRestoreBackup) String() string { func (*JobResult_MongoDBRestoreBackup) ProtoMessage() {} func (x *JobResult_MongoDBRestoreBackup) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[77] + mi := &file_agentpb_agent_proto_msgTypes[79] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5979,7 +6169,7 @@ func (x *JobResult_MongoDBRestoreBackup) ProtoReflect() protoreflect.Message { // Deprecated: Use JobResult_MongoDBRestoreBackup.ProtoReflect.Descriptor instead. func (*JobResult_MongoDBRestoreBackup) Descriptor() ([]byte, []int) { - return file_agentpb_agent_proto_rawDescGZIP(), []int{34, 4} + return file_agentpb_agent_proto_rawDescGZIP(), []int{36, 4} } // MySQLBackup contains backup job status update. @@ -5992,7 +6182,7 @@ type JobProgress_MySQLBackup struct { func (x *JobProgress_MySQLBackup) Reset() { *x = JobProgress_MySQLBackup{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[78] + mi := &file_agentpb_agent_proto_msgTypes[80] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6005,7 +6195,7 @@ func (x *JobProgress_MySQLBackup) String() string { func (*JobProgress_MySQLBackup) ProtoMessage() {} func (x *JobProgress_MySQLBackup) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[78] + mi := &file_agentpb_agent_proto_msgTypes[80] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6018,7 +6208,7 @@ func (x *JobProgress_MySQLBackup) ProtoReflect() protoreflect.Message { // Deprecated: Use JobProgress_MySQLBackup.ProtoReflect.Descriptor instead. func (*JobProgress_MySQLBackup) Descriptor() ([]byte, []int) { - return file_agentpb_agent_proto_rawDescGZIP(), []int{35, 0} + return file_agentpb_agent_proto_rawDescGZIP(), []int{37, 0} } // MySQLRestoreBackup contains restore backup job status update. @@ -6031,7 +6221,7 @@ type JobProgress_MySQLRestoreBackup struct { func (x *JobProgress_MySQLRestoreBackup) Reset() { *x = JobProgress_MySQLRestoreBackup{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[79] + mi := &file_agentpb_agent_proto_msgTypes[81] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6044,7 +6234,7 @@ func (x *JobProgress_MySQLRestoreBackup) String() string { func (*JobProgress_MySQLRestoreBackup) ProtoMessage() {} func (x *JobProgress_MySQLRestoreBackup) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[79] + mi := &file_agentpb_agent_proto_msgTypes[81] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6057,7 +6247,7 @@ func (x *JobProgress_MySQLRestoreBackup) ProtoReflect() protoreflect.Message { // Deprecated: Use JobProgress_MySQLRestoreBackup.ProtoReflect.Descriptor instead. func (*JobProgress_MySQLRestoreBackup) Descriptor() ([]byte, []int) { - return file_agentpb_agent_proto_rawDescGZIP(), []int{35, 1} + return file_agentpb_agent_proto_rawDescGZIP(), []int{37, 1} } // Logs contains generic logs from job. @@ -6074,7 +6264,7 @@ type JobProgress_Logs struct { func (x *JobProgress_Logs) Reset() { *x = JobProgress_Logs{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[80] + mi := &file_agentpb_agent_proto_msgTypes[82] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6087,7 +6277,7 @@ func (x *JobProgress_Logs) String() string { func (*JobProgress_Logs) ProtoMessage() {} func (x *JobProgress_Logs) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[80] + mi := &file_agentpb_agent_proto_msgTypes[82] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6100,7 +6290,7 @@ func (x *JobProgress_Logs) ProtoReflect() protoreflect.Message { // Deprecated: Use JobProgress_Logs.ProtoReflect.Descriptor instead. func (*JobProgress_Logs) Descriptor() ([]byte, []int) { - return file_agentpb_agent_proto_rawDescGZIP(), []int{35, 2} + return file_agentpb_agent_proto_rawDescGZIP(), []int{37, 2} } func (x *JobProgress_Logs) GetChunkId() uint32 { @@ -6134,7 +6324,7 @@ type GetVersionsRequest_MySQLd struct { func (x *GetVersionsRequest_MySQLd) Reset() { *x = GetVersionsRequest_MySQLd{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[81] + mi := &file_agentpb_agent_proto_msgTypes[83] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6147,7 +6337,7 @@ func (x *GetVersionsRequest_MySQLd) String() string { func (*GetVersionsRequest_MySQLd) ProtoMessage() {} func (x *GetVersionsRequest_MySQLd) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[81] + mi := &file_agentpb_agent_proto_msgTypes[83] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6160,7 +6350,7 @@ func (x *GetVersionsRequest_MySQLd) ProtoReflect() protoreflect.Message { // Deprecated: Use GetVersionsRequest_MySQLd.ProtoReflect.Descriptor instead. func (*GetVersionsRequest_MySQLd) Descriptor() ([]byte, []int) { - return file_agentpb_agent_proto_rawDescGZIP(), []int{36, 0} + return file_agentpb_agent_proto_rawDescGZIP(), []int{38, 0} } // Xtrabackup is used for xtrabackup binary version retrieving. @@ -6173,7 +6363,7 @@ type GetVersionsRequest_Xtrabackup struct { func (x *GetVersionsRequest_Xtrabackup) Reset() { *x = GetVersionsRequest_Xtrabackup{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[82] + mi := &file_agentpb_agent_proto_msgTypes[84] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6186,7 +6376,7 @@ func (x *GetVersionsRequest_Xtrabackup) String() string { func (*GetVersionsRequest_Xtrabackup) ProtoMessage() {} func (x *GetVersionsRequest_Xtrabackup) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[82] + mi := &file_agentpb_agent_proto_msgTypes[84] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6199,7 +6389,7 @@ func (x *GetVersionsRequest_Xtrabackup) ProtoReflect() protoreflect.Message { // Deprecated: Use GetVersionsRequest_Xtrabackup.ProtoReflect.Descriptor instead. func (*GetVersionsRequest_Xtrabackup) Descriptor() ([]byte, []int) { - return file_agentpb_agent_proto_rawDescGZIP(), []int{36, 1} + return file_agentpb_agent_proto_rawDescGZIP(), []int{38, 1} } // Xbcloud is used for xbcloud binary version retrieving. @@ -6212,7 +6402,7 @@ type GetVersionsRequest_Xbcloud struct { func (x *GetVersionsRequest_Xbcloud) Reset() { *x = GetVersionsRequest_Xbcloud{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[83] + mi := &file_agentpb_agent_proto_msgTypes[85] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6225,7 +6415,7 @@ func (x *GetVersionsRequest_Xbcloud) String() string { func (*GetVersionsRequest_Xbcloud) ProtoMessage() {} func (x *GetVersionsRequest_Xbcloud) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[83] + mi := &file_agentpb_agent_proto_msgTypes[85] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6238,7 +6428,7 @@ func (x *GetVersionsRequest_Xbcloud) ProtoReflect() protoreflect.Message { // Deprecated: Use GetVersionsRequest_Xbcloud.ProtoReflect.Descriptor instead. func (*GetVersionsRequest_Xbcloud) Descriptor() ([]byte, []int) { - return file_agentpb_agent_proto_rawDescGZIP(), []int{36, 2} + return file_agentpb_agent_proto_rawDescGZIP(), []int{38, 2} } // Qpress is used for qpress binary version retrieving. @@ -6251,7 +6441,7 @@ type GetVersionsRequest_Qpress struct { func (x *GetVersionsRequest_Qpress) Reset() { *x = GetVersionsRequest_Qpress{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[84] + mi := &file_agentpb_agent_proto_msgTypes[86] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6264,7 +6454,7 @@ func (x *GetVersionsRequest_Qpress) String() string { func (*GetVersionsRequest_Qpress) ProtoMessage() {} func (x *GetVersionsRequest_Qpress) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[84] + mi := &file_agentpb_agent_proto_msgTypes[86] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6277,7 +6467,7 @@ func (x *GetVersionsRequest_Qpress) ProtoReflect() protoreflect.Message { // Deprecated: Use GetVersionsRequest_Qpress.ProtoReflect.Descriptor instead. func (*GetVersionsRequest_Qpress) Descriptor() ([]byte, []int) { - return file_agentpb_agent_proto_rawDescGZIP(), []int{36, 3} + return file_agentpb_agent_proto_rawDescGZIP(), []int{38, 3} } // MongoDB is used for mongod binary version retrieving. @@ -6290,7 +6480,7 @@ type GetVersionsRequest_MongoDB struct { func (x *GetVersionsRequest_MongoDB) Reset() { *x = GetVersionsRequest_MongoDB{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[85] + mi := &file_agentpb_agent_proto_msgTypes[87] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6303,7 +6493,7 @@ func (x *GetVersionsRequest_MongoDB) String() string { func (*GetVersionsRequest_MongoDB) ProtoMessage() {} func (x *GetVersionsRequest_MongoDB) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[85] + mi := &file_agentpb_agent_proto_msgTypes[87] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6316,7 +6506,7 @@ func (x *GetVersionsRequest_MongoDB) ProtoReflect() protoreflect.Message { // Deprecated: Use GetVersionsRequest_MongoDB.ProtoReflect.Descriptor instead. func (*GetVersionsRequest_MongoDB) Descriptor() ([]byte, []int) { - return file_agentpb_agent_proto_rawDescGZIP(), []int{36, 4} + return file_agentpb_agent_proto_rawDescGZIP(), []int{38, 4} } // PBM is used for pbm (Percona Backup for MongoDB) binary version retrieving. @@ -6329,7 +6519,7 @@ type GetVersionsRequest_PBM struct { func (x *GetVersionsRequest_PBM) Reset() { *x = GetVersionsRequest_PBM{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[86] + mi := &file_agentpb_agent_proto_msgTypes[88] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6342,7 +6532,7 @@ func (x *GetVersionsRequest_PBM) String() string { func (*GetVersionsRequest_PBM) ProtoMessage() {} func (x *GetVersionsRequest_PBM) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[86] + mi := &file_agentpb_agent_proto_msgTypes[88] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6355,7 +6545,7 @@ func (x *GetVersionsRequest_PBM) ProtoReflect() protoreflect.Message { // Deprecated: Use GetVersionsRequest_PBM.ProtoReflect.Descriptor instead. func (*GetVersionsRequest_PBM) Descriptor() ([]byte, []int) { - return file_agentpb_agent_proto_rawDescGZIP(), []int{36, 5} + return file_agentpb_agent_proto_rawDescGZIP(), []int{38, 5} } // Software is used to select software for which retrieve version. @@ -6378,7 +6568,7 @@ type GetVersionsRequest_Software struct { func (x *GetVersionsRequest_Software) Reset() { *x = GetVersionsRequest_Software{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[87] + mi := &file_agentpb_agent_proto_msgTypes[89] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6391,7 +6581,7 @@ func (x *GetVersionsRequest_Software) String() string { func (*GetVersionsRequest_Software) ProtoMessage() {} func (x *GetVersionsRequest_Software) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[87] + mi := &file_agentpb_agent_proto_msgTypes[89] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6404,7 +6594,7 @@ func (x *GetVersionsRequest_Software) ProtoReflect() protoreflect.Message { // Deprecated: Use GetVersionsRequest_Software.ProtoReflect.Descriptor instead. func (*GetVersionsRequest_Software) Descriptor() ([]byte, []int) { - return file_agentpb_agent_proto_rawDescGZIP(), []int{36, 6} + return file_agentpb_agent_proto_rawDescGZIP(), []int{38, 6} } func (m *GetVersionsRequest_Software) GetSoftware() isGetVersionsRequest_Software_Software { @@ -6510,7 +6700,7 @@ type GetVersionsResponse_Version struct { func (x *GetVersionsResponse_Version) Reset() { *x = GetVersionsResponse_Version{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[88] + mi := &file_agentpb_agent_proto_msgTypes[90] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6523,7 +6713,7 @@ func (x *GetVersionsResponse_Version) String() string { func (*GetVersionsResponse_Version) ProtoMessage() {} func (x *GetVersionsResponse_Version) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[88] + mi := &file_agentpb_agent_proto_msgTypes[90] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6536,7 +6726,7 @@ func (x *GetVersionsResponse_Version) ProtoReflect() protoreflect.Message { // Deprecated: Use GetVersionsResponse_Version.ProtoReflect.Descriptor instead. func (*GetVersionsResponse_Version) Descriptor() ([]byte, []int) { - return file_agentpb_agent_proto_rawDescGZIP(), []int{37, 0} + return file_agentpb_agent_proto_rawDescGZIP(), []int{39, 0} } func (x *GetVersionsResponse_Version) GetVersion() string { @@ -7129,435 +7319,466 @@ var file_agentpb_agent_proto_rawDesc = []byte{ 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x09, 0x74, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, - 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x22, 0x95, 0x01, 0x0a, 0x17, 0x43, 0x68, 0x65, + 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x22, 0xb3, 0x01, 0x0a, 0x17, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x3a, 0x0a, 0x05, 0x73, 0x74, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x3e, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, - 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x1a, 0x28, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, - 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x22, 0x29, 0x0a, 0x10, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x22, 0x29, 0x0a, 0x11, 0x4a, - 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x14, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x76, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x05, 0x61, 0x6c, 0x69, 0x76, 0x65, 0x22, 0xb2, 0x01, 0x0a, 0x10, 0x53, 0x33, 0x4c, 0x6f, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x65, - 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, - 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x65, 0x73, - 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, - 0x65, 0x73, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, - 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x63, 0x72, - 0x65, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x75, 0x63, 0x6b, - 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, - 0x5f, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x62, - 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x22, 0x2e, 0x0a, 0x18, 0x46, - 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x22, 0xc3, 0x0f, 0x0a, 0x0f, - 0x53, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x12, 0x33, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x47, 0x0a, 0x0c, 0x6d, - 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0b, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4a, - 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x42, - 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x0b, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x42, 0x61, - 0x63, 0x6b, 0x75, 0x70, 0x12, 0x5d, 0x0a, 0x14, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x72, 0x65, - 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0c, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, - 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, - 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, - 0x12, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, - 0x6b, 0x75, 0x70, 0x12, 0x4d, 0x0a, 0x0e, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x62, - 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x42, 0x61, 0x63, 0x6b, 0x75, - 0x70, 0x48, 0x00, 0x52, 0x0d, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x42, 0x61, 0x63, 0x6b, - 0x75, 0x70, 0x12, 0x63, 0x0a, 0x16, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x72, 0x65, - 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0e, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, - 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, - 0x44, 0x42, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, - 0x00, 0x52, 0x14, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, - 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x1a, 0x93, 0x02, 0x0a, 0x0b, 0x4d, 0x79, 0x53, 0x51, - 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x70, - 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, - 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x33, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x33, 0x4c, - 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, - 0x08, 0x73, 0x33, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x6c, - 0x64, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x6f, 0x6c, 0x64, 0x65, - 0x72, 0x42, 0x11, 0x0a, 0x0f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x4a, 0x04, 0x08, 0x0b, 0x10, 0x0c, 0x52, 0x11, 0x66, 0x69, 0x6c, 0x65, - 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0xc3, 0x01, - 0x0a, 0x12, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, - 0x63, 0x6b, 0x75, 0x70, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x33, 0x5f, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x2e, 0x53, 0x33, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x08, 0x73, 0x33, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, - 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x42, 0x11, 0x0a, 0x0f, 0x6c, 0x6f, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4a, 0x04, 0x08, 0x0b, 0x10, 0x0c, - 0x52, 0x11, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x1a, 0xf9, 0x03, 0x0a, 0x0d, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x42, - 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x16, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x1e, 0x0a, - 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x02, 0x18, 0x01, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x1c, 0x0a, - 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, - 0x18, 0x01, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x16, 0x0a, 0x04, 0x70, - 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x42, 0x02, 0x18, 0x01, 0x52, 0x04, 0x70, - 0x6f, 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x69, - 0x74, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x50, 0x69, 0x74, 0x72, 0x12, 0x33, 0x0a, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x6d, 0x6f, 0x64, - 0x65, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, - 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x09, - 0x64, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x33, 0x5f, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x33, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x08, 0x73, 0x33, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x12, 0x4e, 0x0a, 0x11, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x4c, - 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, - 0x10, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, - 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x73, 0x6e, 0x12, 0x2f, 0x0a, 0x0a, 0x74, - 0x65, 0x78, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, - 0x73, 0x52, 0x09, 0x74, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x42, 0x11, 0x0a, 0x0f, - 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, - 0xa8, 0x04, 0x0a, 0x14, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x52, 0x65, 0x73, 0x74, 0x6f, - 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x16, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, - 0x12, 0x1e, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, - 0x12, 0x1c, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x16, - 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x42, 0x02, 0x18, 0x01, - 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x06, 0x73, 0x6f, 0x63, 0x6b, - 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x41, 0x0a, 0x0e, 0x70, 0x69, 0x74, 0x72, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x07, 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, 0x0d, 0x70, 0x69, 0x74, 0x72, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x33, 0x5f, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x33, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x08, 0x73, 0x33, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x12, 0x4e, 0x0a, 0x11, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x4c, - 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, - 0x10, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x12, 0x39, 0x0a, 0x0c, 0x70, 0x62, 0x6d, - 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x16, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x62, 0x6d, 0x4d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x0b, 0x70, 0x62, 0x6d, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x64, 0x73, 0x6e, 0x12, 0x2f, 0x0a, 0x0a, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x66, - 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x09, 0x74, 0x65, - 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x42, 0x11, 0x0a, 0x0f, 0x6c, 0x6f, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x05, 0x0a, 0x03, 0x6a, 0x6f, - 0x62, 0x22, 0x28, 0x0a, 0x10, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x27, 0x0a, 0x0e, 0x53, - 0x74, 0x6f, 0x70, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, + 0x02, 0x18, 0x01, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x1a, 0x42, 0x0a, 0x05, 0x53, 0x74, + 0x61, 0x74, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xe0, + 0x01, 0x0a, 0x12, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x64, 0x73, 0x6e, 0x12, 0x33, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x2f, 0x0a, 0x0a, 0x74, 0x65, 0x78, 0x74, + 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x09, + 0x74, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, + 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, + 0x79, 0x22, 0x66, 0x0a, 0x13, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x1f, + 0x0a, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, + 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x0a, 0x10, 0x4a, 0x6f, 0x62, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, - 0x6f, 0x62, 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x53, 0x74, 0x6f, 0x70, 0x4a, 0x6f, 0x62, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xdb, 0x05, 0x0a, 0x09, 0x4a, 0x6f, 0x62, 0x52, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x09, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 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, 0x09, 0x74, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2e, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, - 0x62, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, - 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x41, 0x0a, 0x0c, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, - 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x4d, - 0x79, 0x53, 0x51, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x0b, 0x6d, 0x79, - 0x73, 0x71, 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x57, 0x0a, 0x14, 0x6d, 0x79, 0x73, - 0x71, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, - 0x70, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, - 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x52, - 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x12, - 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, - 0x75, 0x70, 0x12, 0x47, 0x0a, 0x0e, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x62, 0x61, - 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x4d, 0x6f, 0x6e, + 0x6f, 0x62, 0x49, 0x64, 0x22, 0x29, 0x0a, 0x11, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x6c, 0x69, + 0x76, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x76, 0x65, 0x22, + 0xb2, 0x01, 0x0a, 0x10, 0x53, 0x33, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4b, 0x65, 0x79, 0x12, + 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x1f, + 0x0a, 0x0b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x23, 0x0a, 0x0d, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, + 0x67, 0x69, 0x6f, 0x6e, 0x22, 0x2e, 0x0a, 0x18, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, + 0x65, 0x6d, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x70, 0x61, 0x74, 0x68, 0x22, 0xc3, 0x0f, 0x0a, 0x0f, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, + 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x12, + 0x33, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x74, 0x69, 0x6d, + 0x65, 0x6f, 0x75, 0x74, 0x12, 0x47, 0x0a, 0x0c, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x62, 0x61, + 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, + 0x52, 0x0b, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x5d, 0x0a, + 0x14, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x62, + 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, + 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x12, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x52, + 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x4d, 0x0a, 0x0e, + 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0d, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x0d, 0x6d, 0x6f, - 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x5d, 0x0a, 0x16, 0x6d, + 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x63, 0x0a, 0x16, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x62, - 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x4d, 0x6f, - 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, - 0x75, 0x70, 0x48, 0x00, 0x52, 0x14, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x52, 0x65, 0x73, - 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x1a, 0x21, 0x0a, 0x05, 0x45, 0x72, - 0x72, 0x6f, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x6e, 0x0a, - 0x0d, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x2c, - 0x0a, 0x12, 0x69, 0x73, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x65, 0x64, 0x5f, 0x63, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x69, 0x73, 0x53, 0x68, - 0x61, 0x72, 0x64, 0x65, 0x64, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x2f, 0x0a, 0x08, - 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, - 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3e, 0x0a, - 0x0b, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x2f, 0x0a, 0x08, - 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, - 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x14, 0x0a, + 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x52, 0x65, 0x73, 0x74, 0x6f, + 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x14, 0x6d, 0x6f, 0x6e, 0x67, + 0x6f, 0x64, 0x62, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, + 0x1a, 0x93, 0x02, 0x0a, 0x0b, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, + 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x75, 0x73, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, + 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, + 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x16, + 0x0a, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x33, + 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x33, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x08, 0x73, 0x33, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x42, 0x11, 0x0a, 0x0f, 0x6c, 0x6f, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4a, 0x04, 0x08, + 0x0b, 0x10, 0x0c, 0x52, 0x11, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0xc3, 0x01, 0x0a, 0x12, 0x4d, 0x79, 0x53, 0x51, 0x4c, + 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x1d, 0x0a, + 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x36, 0x0a, 0x09, 0x73, 0x33, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x33, 0x4c, 0x6f, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x08, + 0x73, 0x33, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x6c, 0x64, + 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, + 0x42, 0x11, 0x0a, 0x0f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x4a, 0x04, 0x08, 0x0b, 0x10, 0x0c, 0x52, 0x11, 0x66, 0x69, 0x6c, 0x65, 0x73, + 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0xf9, 0x03, 0x0a, + 0x0d, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x16, + 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, + 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, + 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x08, 0x70, 0x61, + 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x1c, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x07, 0x61, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x12, 0x16, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x05, 0x42, 0x02, 0x18, 0x01, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x06, + 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, + 0x52, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, + 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x69, 0x74, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0a, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x69, 0x74, 0x72, 0x12, 0x33, 0x0a, + 0x0a, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x14, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x61, + 0x74, 0x61, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x09, 0x64, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x64, + 0x65, 0x6c, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x33, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x33, + 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, + 0x52, 0x08, 0x73, 0x33, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x4e, 0x0a, 0x11, 0x66, 0x69, + 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, + 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x46, 0x69, + 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x10, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, + 0x73, 0x74, 0x65, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x6f, + 0x6c, 0x64, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x6f, 0x6c, 0x64, + 0x65, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x64, 0x73, 0x6e, 0x12, 0x2f, 0x0a, 0x0a, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x66, 0x69, 0x6c, + 0x65, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x2e, 0x54, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x09, 0x74, 0x65, 0x78, 0x74, + 0x46, 0x69, 0x6c, 0x65, 0x73, 0x42, 0x11, 0x0a, 0x0f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0xa8, 0x04, 0x0a, 0x14, 0x4d, 0x6f, 0x6e, + 0x67, 0x6f, 0x44, 0x42, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, + 0x70, 0x12, 0x16, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x02, 0x18, 0x01, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x08, 0x70, 0x61, 0x73, + 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, + 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x1c, 0x0a, 0x07, 0x61, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x07, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x16, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x05, 0x42, 0x02, 0x18, 0x01, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, + 0x1a, 0x0a, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x02, 0x18, 0x01, 0x52, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x41, 0x0a, 0x0e, 0x70, 0x69, 0x74, 0x72, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x18, 0x07, 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, 0x0d, 0x70, 0x69, 0x74, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x33, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x33, + 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, + 0x52, 0x08, 0x73, 0x33, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x4e, 0x0a, 0x11, 0x66, 0x69, + 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, + 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x46, 0x69, + 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x10, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, + 0x73, 0x74, 0x65, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x6f, + 0x6c, 0x64, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x6f, 0x6c, 0x64, + 0x65, 0x72, 0x12, 0x39, 0x0a, 0x0c, 0x70, 0x62, 0x6d, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, + 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x62, 0x6d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x52, 0x0b, 0x70, 0x62, 0x6d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x10, 0x0a, + 0x03, 0x64, 0x73, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x73, 0x6e, 0x12, + 0x2f, 0x0a, 0x0a, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0f, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, + 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x09, 0x74, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, + 0x42, 0x11, 0x0a, 0x0f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x42, 0x05, 0x0a, 0x03, 0x6a, 0x6f, 0x62, 0x22, 0x28, 0x0a, 0x10, 0x53, 0x74, + 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, + 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x22, 0x27, 0x0a, 0x0e, 0x53, 0x74, 0x6f, 0x70, 0x4a, 0x6f, 0x62, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x22, 0x11, 0x0a, + 0x0f, 0x53, 0x74, 0x6f, 0x70, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0xdb, 0x05, 0x0a, 0x09, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x15, + 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x18, 0x02, 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, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, + 0x2e, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, + 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, + 0x41, 0x0a, 0x0c, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, + 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, + 0x62, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x42, 0x61, 0x63, + 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x0b, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x42, 0x61, 0x63, 0x6b, + 0x75, 0x70, 0x12, 0x57, 0x0a, 0x14, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x74, + 0x6f, 0x72, 0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x23, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, + 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x12, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x52, 0x65, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x47, 0x0a, 0x0e, 0x6d, + 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0e, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x52, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x42, 0x61, 0x63, + 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x0d, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x42, 0x61, + 0x63, 0x6b, 0x75, 0x70, 0x12, 0x5d, 0x0a, 0x16, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, + 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0f, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, + 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x52, 0x65, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x14, 0x6d, + 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, + 0x6b, 0x75, 0x70, 0x1a, 0x21, 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x18, 0x0a, 0x07, + 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x6e, 0x0a, 0x0d, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, + 0x42, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x2c, 0x0a, 0x12, 0x69, 0x73, 0x5f, 0x73, 0x68, + 0x61, 0x72, 0x64, 0x65, 0x64, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x10, 0x69, 0x73, 0x53, 0x68, 0x61, 0x72, 0x64, 0x65, 0x64, 0x43, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x2f, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, + 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3e, 0x0a, 0x0b, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x42, + 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x2f, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, + 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x14, 0x0a, 0x12, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x52, + 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x1a, 0x16, 0x0a, 0x14, + 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, + 0x63, 0x6b, 0x75, 0x70, 0x42, 0x08, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0xa7, + 0x03, 0x0a, 0x0b, 0x4a, 0x6f, 0x62, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x15, + 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x18, 0x02, 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, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, + 0x43, 0x0a, 0x0c, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, + 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, + 0x62, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x42, + 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x0b, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x42, 0x61, + 0x63, 0x6b, 0x75, 0x70, 0x12, 0x59, 0x0a, 0x14, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x72, 0x65, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0c, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x50, 0x72, + 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x52, 0x65, 0x73, 0x74, + 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x12, 0x6d, 0x79, 0x73, + 0x71, 0x6c, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, + 0x2d, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, + 0x73, 0x2e, 0x4c, 0x6f, 0x67, 0x73, 0x48, 0x00, 0x52, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x1a, 0x0d, + 0x0a, 0x0b, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x1a, 0x14, 0x0a, 0x12, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, - 0x6b, 0x75, 0x70, 0x1a, 0x16, 0x0a, 0x14, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x52, 0x65, - 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x42, 0x08, 0x0a, 0x06, 0x72, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0xa7, 0x03, 0x0a, 0x0b, 0x4a, 0x6f, 0x62, 0x50, 0x72, 0x6f, - 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x09, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 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, 0x09, 0x74, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x43, 0x0a, 0x0c, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, - 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, - 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x0b, - 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x59, 0x0a, 0x14, 0x6d, - 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x62, 0x61, 0x63, - 0x6b, 0x75, 0x70, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x4d, 0x79, - 0x53, 0x51, 0x4c, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, - 0x48, 0x00, 0x52, 0x12, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, - 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x2d, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x14, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, - 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x4c, 0x6f, 0x67, 0x73, 0x48, 0x00, 0x52, - 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x1a, 0x0d, 0x0a, 0x0b, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x42, 0x61, - 0x63, 0x6b, 0x75, 0x70, 0x1a, 0x14, 0x0a, 0x12, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x52, 0x65, 0x73, - 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x1a, 0x49, 0x0a, 0x04, 0x4c, 0x6f, - 0x67, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x49, 0x64, 0x12, 0x12, 0x0a, - 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, - 0x61, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x6f, 0x6e, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x04, 0x64, 0x6f, 0x6e, 0x65, 0x42, 0x08, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, - 0x9d, 0x04, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x09, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, - 0x72, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x2e, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x52, 0x09, 0x73, - 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x73, 0x1a, 0x08, 0x0a, 0x06, 0x4d, 0x79, 0x53, 0x51, - 0x4c, 0x64, 0x1a, 0x0c, 0x0a, 0x0a, 0x58, 0x74, 0x72, 0x61, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, - 0x1a, 0x09, 0x0a, 0x07, 0x58, 0x62, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x1a, 0x08, 0x0a, 0x06, 0x51, - 0x70, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x09, 0x0a, 0x07, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, - 0x1a, 0x05, 0x0a, 0x03, 0x50, 0x42, 0x4d, 0x1a, 0x85, 0x03, 0x0a, 0x08, 0x53, 0x6f, 0x66, 0x74, - 0x77, 0x61, 0x72, 0x65, 0x12, 0x3a, 0x0a, 0x06, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, - 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x48, 0x00, 0x52, 0x06, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, - 0x12, 0x46, 0x0a, 0x0a, 0x78, 0x74, 0x72, 0x61, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, - 0x58, 0x74, 0x72, 0x61, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x0a, 0x78, 0x74, - 0x72, 0x61, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x3d, 0x0a, 0x07, 0x78, 0x62, 0x63, 0x6c, - 0x6f, 0x75, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x2e, 0x58, 0x62, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x48, 0x00, 0x52, 0x07, - 0x78, 0x62, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x12, 0x3a, 0x0a, 0x06, 0x71, 0x70, 0x72, 0x65, 0x73, - 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, - 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x2e, 0x51, 0x70, 0x72, 0x65, 0x73, 0x73, 0x48, 0x00, 0x52, 0x06, 0x71, 0x70, 0x72, - 0x65, 0x73, 0x73, 0x12, 0x3b, 0x0a, 0x06, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, - 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x48, 0x00, 0x52, 0x06, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, - 0x12, 0x31, 0x0a, 0x03, 0x70, 0x62, 0x6d, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, + 0x6b, 0x75, 0x70, 0x1a, 0x49, 0x0a, 0x04, 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x63, + 0x68, 0x75, 0x6e, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x63, + 0x68, 0x75, 0x6e, 0x6b, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x6f, + 0x6e, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x6f, 0x6e, 0x65, 0x42, 0x08, + 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x9d, 0x04, 0x0a, 0x12, 0x47, 0x65, 0x74, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x40, 0x0a, 0x09, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x53, 0x6f, + 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x52, 0x09, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, + 0x73, 0x1a, 0x08, 0x0a, 0x06, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x1a, 0x0c, 0x0a, 0x0a, 0x58, + 0x74, 0x72, 0x61, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x1a, 0x09, 0x0a, 0x07, 0x58, 0x62, 0x63, + 0x6c, 0x6f, 0x75, 0x64, 0x1a, 0x08, 0x0a, 0x06, 0x51, 0x70, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x09, + 0x0a, 0x07, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x1a, 0x05, 0x0a, 0x03, 0x50, 0x42, 0x4d, + 0x1a, 0x85, 0x03, 0x0a, 0x08, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x12, 0x3a, 0x0a, + 0x06, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x42, 0x4d, 0x48, 0x00, 0x52, 0x03, - 0x70, 0x62, 0x6d, 0x42, 0x0a, 0x0a, 0x08, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x22, - 0x90, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x76, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x39, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x22, 0xbb, 0x08, 0x0a, 0x0c, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x02, 0x69, 0x64, 0x12, 0x2b, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0xff, 0x0f, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, - 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x21, 0x0a, 0x04, 0x70, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, - 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x04, 0x70, - 0x69, 0x6e, 0x67, 0x12, 0x41, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0c, 0x73, 0x74, 0x61, 0x74, 0x65, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x12, 0x3b, 0x0a, 0x0b, 0x71, 0x61, 0x6e, 0x5f, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x2e, 0x51, 0x41, 0x4e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0a, 0x71, 0x61, 0x6e, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x12, 0x41, 0x0a, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0c, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x31, 0x0a, 0x0a, 0x6a, 0x6f, 0x62, 0x5f, 0x72, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x48, 0x00, 0x52, 0x09, - 0x6a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x37, 0x0a, 0x0c, 0x6a, 0x6f, 0x62, - 0x5f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x12, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x50, 0x72, 0x6f, 0x67, 0x72, - 0x65, 0x73, 0x73, 0x48, 0x00, 0x52, 0x0b, 0x6a, 0x6f, 0x62, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, - 0x73, 0x73, 0x12, 0x21, 0x0a, 0x04, 0x70, 0x6f, 0x6e, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x0b, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x6f, 0x6e, 0x67, 0x48, 0x00, 0x52, - 0x04, 0x70, 0x6f, 0x6e, 0x67, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x65, 0x74, 0x5f, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x2e, 0x53, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x48, 0x00, 0x52, 0x08, 0x73, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3f, 0x0a, - 0x0c, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, - 0x00, 0x52, 0x0b, 0x73, 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3c, - 0x0a, 0x0b, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x6f, 0x70, - 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, - 0x52, 0x0a, 0x73, 0x74, 0x6f, 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4b, 0x0a, 0x10, - 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x43, - 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x0f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x43, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x5f, 0x6a, 0x6f, 0x62, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x08, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, - 0x62, 0x12, 0x33, 0x0a, 0x08, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x6a, 0x6f, 0x62, 0x18, 0x0e, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x6f, 0x70, - 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x07, 0x73, - 0x74, 0x6f, 0x70, 0x4a, 0x6f, 0x62, 0x12, 0x39, 0x0a, 0x0a, 0x6a, 0x6f, 0x62, 0x5f, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x09, 0x6a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x3f, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, - 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x0b, 0x67, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x46, 0x0a, 0x0f, 0x70, 0x62, 0x6d, 0x5f, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, - 0x5f, 0x70, 0x69, 0x74, 0x72, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x42, 0x4d, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x50, 0x49, 0x54, - 0x52, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x0d, 0x70, 0x62, 0x6d, - 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x50, 0x69, 0x74, 0x72, 0x12, 0x39, 0x0a, 0x0a, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x5f, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, - 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x09, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, - 0x22, 0xc9, 0x07, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x2b, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0xff, 0x0f, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, - 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x21, 0x0a, 0x04, 0x70, 0x6f, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x6f, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x04, 0x70, 0x6f, - 0x6e, 0x67, 0x12, 0x42, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x0c, 0x73, 0x74, 0x61, 0x74, 0x65, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x12, 0x3c, 0x0a, 0x0b, 0x71, 0x61, 0x6e, 0x5f, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x2e, 0x51, 0x41, 0x4e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x0a, 0x71, 0x61, 0x6e, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x12, 0x42, 0x0a, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x0c, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x21, 0x0a, 0x04, 0x70, 0x69, 0x6e, 0x67, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x50, - 0x69, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x04, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x35, 0x0a, 0x09, 0x73, - 0x65, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, - 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x08, 0x73, 0x65, 0x74, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x0c, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x3b, 0x0a, 0x0b, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, - 0x53, 0x74, 0x6f, 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x48, 0x00, 0x52, 0x0a, 0x73, 0x74, 0x6f, 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x4a, 0x0a, 0x10, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0f, 0x63, 0x68, 0x65, 0x63, - 0x6b, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x35, 0x0a, 0x09, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x5f, 0x6a, 0x6f, 0x62, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, - 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x08, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4a, - 0x6f, 0x62, 0x12, 0x32, 0x0a, 0x08, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x6a, 0x6f, 0x62, 0x18, 0x0e, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x6f, - 0x70, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x07, 0x73, - 0x74, 0x6f, 0x70, 0x4a, 0x6f, 0x62, 0x12, 0x38, 0x0a, 0x0a, 0x6a, 0x6f, 0x62, 0x5f, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x09, 0x6a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x3e, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x47, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x48, + 0x00, 0x52, 0x06, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x12, 0x46, 0x0a, 0x0a, 0x78, 0x74, 0x72, + 0x61, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x58, 0x74, 0x72, 0x61, 0x62, 0x61, 0x63, + 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x0a, 0x78, 0x74, 0x72, 0x61, 0x62, 0x61, 0x63, 0x6b, 0x75, + 0x70, 0x12, 0x3d, 0x0a, 0x07, 0x78, 0x62, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x58, 0x62, + 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x48, 0x00, 0x52, 0x07, 0x78, 0x62, 0x63, 0x6c, 0x6f, 0x75, 0x64, + 0x12, 0x3a, 0x0a, 0x06, 0x71, 0x70, 0x72, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x20, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x51, 0x70, 0x72, 0x65, + 0x73, 0x73, 0x48, 0x00, 0x52, 0x06, 0x71, 0x70, 0x72, 0x65, 0x73, 0x73, 0x12, 0x3b, 0x0a, 0x06, + 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x48, + 0x00, 0x52, 0x06, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x12, 0x31, 0x0a, 0x03, 0x70, 0x62, 0x6d, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x48, 0x00, 0x52, 0x0b, 0x67, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x12, 0x45, 0x0a, 0x0f, 0x70, 0x62, 0x6d, 0x5f, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x5f, 0x70, - 0x69, 0x74, 0x72, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x2e, 0x50, 0x42, 0x4d, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x50, 0x49, 0x54, 0x52, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0d, 0x70, 0x62, 0x6d, 0x53, 0x77, 0x69, - 0x74, 0x63, 0x68, 0x50, 0x69, 0x74, 0x72, 0x12, 0x38, 0x0a, 0x0a, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x5f, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x09, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, - 0x73, 0x42, 0x09, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x2a, 0xc4, 0x01, 0x0a, - 0x18, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x45, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x4f, 0x75, 0x74, - 0x70, 0x75, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x27, 0x0a, 0x23, 0x4d, 0x59, 0x53, - 0x51, 0x4c, 0x5f, 0x45, 0x58, 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x5f, 0x4f, 0x55, 0x54, 0x50, 0x55, - 0x54, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, - 0x10, 0x00, 0x12, 0x27, 0x0a, 0x23, 0x4d, 0x59, 0x53, 0x51, 0x4c, 0x5f, 0x45, 0x58, 0x50, 0x4c, - 0x41, 0x49, 0x4e, 0x5f, 0x4f, 0x55, 0x54, 0x50, 0x55, 0x54, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, - 0x54, 0x5f, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x10, 0x01, 0x12, 0x24, 0x0a, 0x20, 0x4d, + 0x74, 0x2e, 0x50, 0x42, 0x4d, 0x48, 0x00, 0x52, 0x03, 0x70, 0x62, 0x6d, 0x42, 0x0a, 0x0a, 0x08, + 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x22, 0x90, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x3e, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x1a, 0x39, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xfc, 0x08, 0x0a, 0x0c, + 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2b, 0x0a, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0xff, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x21, 0x0a, 0x04, 0x70, 0x69, 0x6e, + 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, + 0x50, 0x69, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x04, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x41, 0x0a, 0x0d, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, + 0x00, 0x52, 0x0c, 0x73, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x12, + 0x3b, 0x0a, 0x0b, 0x71, 0x61, 0x6e, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x51, 0x41, 0x4e, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, + 0x52, 0x0a, 0x71, 0x61, 0x6e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x12, 0x41, 0x0a, 0x0d, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, + 0x00, 0x52, 0x0c, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, + 0x31, 0x0a, 0x0a, 0x6a, 0x6f, 0x62, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x10, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x52, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x48, 0x00, 0x52, 0x09, 0x6a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x12, 0x37, 0x0a, 0x0c, 0x6a, 0x6f, 0x62, 0x5f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, + 0x73, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x2e, 0x4a, 0x6f, 0x62, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x48, 0x00, 0x52, 0x0b, + 0x6a, 0x6f, 0x62, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x21, 0x0a, 0x04, 0x70, + 0x6f, 0x6e, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x2e, 0x50, 0x6f, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x04, 0x70, 0x6f, 0x6e, 0x67, 0x12, 0x36, + 0x0a, 0x09, 0x73, 0x65, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x74, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x08, 0x73, 0x65, + 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3f, 0x0a, 0x0c, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3c, 0x0a, 0x0b, 0x73, 0x74, 0x6f, 0x70, 0x5f, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x0a, 0x73, 0x74, 0x6f, 0x70, 0x41, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4b, 0x0a, 0x10, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x63, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1e, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, + 0x00, 0x52, 0x0f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x6a, 0x6f, 0x62, 0x18, + 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, + 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, + 0x52, 0x08, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x12, 0x33, 0x0a, 0x08, 0x73, 0x74, + 0x6f, 0x70, 0x5f, 0x6a, 0x6f, 0x62, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x07, 0x73, 0x74, 0x6f, 0x70, 0x4a, 0x6f, 0x62, 0x12, + 0x39, 0x0a, 0x0a, 0x6a, 0x6f, 0x62, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0f, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, + 0x09, 0x6a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3f, 0x0a, 0x0c, 0x67, 0x65, + 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x0b, + 0x67, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x46, 0x0a, 0x0f, 0x70, + 0x62, 0x6d, 0x5f, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x5f, 0x70, 0x69, 0x74, 0x72, 0x18, 0x13, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x42, 0x4d, + 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x50, 0x49, 0x54, 0x52, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x48, 0x00, 0x52, 0x0d, 0x70, 0x62, 0x6d, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x50, + 0x69, 0x74, 0x72, 0x12, 0x39, 0x0a, 0x0a, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x6c, 0x6f, 0x67, + 0x73, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, + 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x48, 0x00, 0x52, 0x09, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x3f, + 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x16, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x48, 0x00, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x42, + 0x09, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x89, 0x08, 0x0a, 0x0d, 0x53, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2b, 0x0a, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0xff, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x21, 0x0a, 0x04, 0x70, 0x6f, 0x6e, + 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, + 0x50, 0x6f, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x04, 0x70, 0x6f, 0x6e, 0x67, 0x12, 0x42, 0x0a, 0x0d, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x48, 0x00, 0x52, 0x0c, 0x73, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, + 0x12, 0x3c, 0x0a, 0x0b, 0x71, 0x61, 0x6e, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x51, 0x41, + 0x4e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x48, 0x00, 0x52, 0x0a, 0x71, 0x61, 0x6e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x12, 0x42, + 0x0a, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x48, 0x00, 0x52, 0x0c, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x12, 0x21, 0x0a, 0x04, 0x70, 0x69, 0x6e, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x0b, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x48, 0x00, 0x52, + 0x04, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x35, 0x0a, 0x09, 0x73, 0x65, 0x74, 0x5f, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x2e, 0x53, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x48, 0x00, 0x52, 0x08, 0x73, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x0c, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, + 0x0b, 0x73, 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3b, 0x0a, 0x0b, + 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x41, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0a, 0x73, + 0x74, 0x6f, 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4a, 0x0a, 0x10, 0x63, 0x68, 0x65, + 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x48, 0x00, 0x52, 0x0f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x35, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x6a, + 0x6f, 0x62, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x48, 0x00, 0x52, 0x08, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x12, 0x32, 0x0a, 0x08, + 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x6a, 0x6f, 0x62, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, + 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x4a, 0x6f, 0x62, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x07, 0x73, 0x74, 0x6f, 0x70, 0x4a, 0x6f, 0x62, + 0x12, 0x38, 0x0a, 0x0a, 0x6a, 0x6f, 0x62, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0f, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, + 0x09, 0x6a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3e, 0x0a, 0x0c, 0x67, 0x65, + 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x19, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0b, 0x67, + 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x45, 0x0a, 0x0f, 0x70, 0x62, + 0x6d, 0x5f, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x5f, 0x70, 0x69, 0x74, 0x72, 0x18, 0x11, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x42, 0x4d, 0x53, + 0x77, 0x69, 0x74, 0x63, 0x68, 0x50, 0x49, 0x54, 0x52, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x48, 0x00, 0x52, 0x0d, 0x70, 0x62, 0x6d, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x50, 0x69, 0x74, + 0x72, 0x12, 0x38, 0x0a, 0x0a, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x6c, 0x6f, 0x67, 0x73, 0x18, + 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, + 0x52, 0x09, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x3e, 0x0a, 0x0c, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x14, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0b, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x09, 0x0a, 0x07, 0x70, + 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x2a, 0xc4, 0x01, 0x0a, 0x18, 0x4d, 0x79, 0x73, 0x71, 0x6c, + 0x45, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x12, 0x27, 0x0a, 0x23, 0x4d, 0x59, 0x53, 0x51, 0x4c, 0x5f, 0x45, 0x58, 0x50, + 0x4c, 0x41, 0x49, 0x4e, 0x5f, 0x4f, 0x55, 0x54, 0x50, 0x55, 0x54, 0x5f, 0x46, 0x4f, 0x52, 0x4d, + 0x41, 0x54, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x27, 0x0a, 0x23, + 0x4d, 0x59, 0x53, 0x51, 0x4c, 0x5f, 0x45, 0x58, 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x5f, 0x4f, 0x55, + 0x54, 0x50, 0x55, 0x54, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x5f, 0x44, 0x45, 0x46, 0x41, + 0x55, 0x4c, 0x54, 0x10, 0x01, 0x12, 0x24, 0x0a, 0x20, 0x4d, 0x59, 0x53, 0x51, 0x4c, 0x5f, 0x45, + 0x58, 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x5f, 0x4f, 0x55, 0x54, 0x50, 0x55, 0x54, 0x5f, 0x46, 0x4f, + 0x52, 0x4d, 0x41, 0x54, 0x5f, 0x4a, 0x53, 0x4f, 0x4e, 0x10, 0x02, 0x12, 0x30, 0x0a, 0x2c, 0x4d, 0x59, 0x53, 0x51, 0x4c, 0x5f, 0x45, 0x58, 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x5f, 0x4f, 0x55, 0x54, - 0x50, 0x55, 0x54, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x5f, 0x4a, 0x53, 0x4f, 0x4e, 0x10, - 0x02, 0x12, 0x30, 0x0a, 0x2c, 0x4d, 0x59, 0x53, 0x51, 0x4c, 0x5f, 0x45, 0x58, 0x50, 0x4c, 0x41, - 0x49, 0x4e, 0x5f, 0x4f, 0x55, 0x54, 0x50, 0x55, 0x54, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, - 0x5f, 0x54, 0x52, 0x41, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x41, 0x4c, 0x5f, 0x4a, 0x53, 0x4f, - 0x4e, 0x10, 0x03, 0x32, 0x41, 0x0a, 0x05, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x07, - 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x12, 0x13, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x14, 0x2e, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x28, 0x01, 0x30, 0x01, 0x42, 0x6f, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x42, 0x0a, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, - 0x01, 0x5a, 0x22, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x65, - 0x72, 0x63, 0x6f, 0x6e, 0x61, 0x2f, 0x70, 0x6d, 0x6d, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0xa2, 0x02, 0x03, 0x41, 0x58, 0x58, 0xaa, 0x02, 0x05, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0xca, 0x02, 0x05, 0x41, 0x67, 0x65, 0x6e, 0x74, 0xe2, 0x02, 0x11, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, - 0x02, 0x05, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x50, 0x55, 0x54, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x5f, 0x54, 0x52, 0x41, 0x44, 0x49, + 0x54, 0x49, 0x4f, 0x4e, 0x41, 0x4c, 0x5f, 0x4a, 0x53, 0x4f, 0x4e, 0x10, 0x03, 0x32, 0x41, 0x0a, + 0x05, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x12, 0x13, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x14, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x28, 0x01, 0x30, 0x01, + 0x42, 0x6f, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x42, 0x0a, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x22, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x65, 0x72, 0x63, 0x6f, 0x6e, 0x61, 0x2f, + 0x70, 0x6d, 0x6d, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x70, 0x62, 0xa2, + 0x02, 0x03, 0x41, 0x58, 0x58, 0xaa, 0x02, 0x05, 0x41, 0x67, 0x65, 0x6e, 0x74, 0xca, 0x02, 0x05, + 0x41, 0x67, 0x65, 0x6e, 0x74, 0xe2, 0x02, 0x11, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x5c, 0x47, 0x50, + 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x05, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -7574,7 +7795,7 @@ func file_agentpb_agent_proto_rawDescGZIP() []byte { var ( file_agentpb_agent_proto_enumTypes = make([]protoimpl.EnumInfo, 2) - file_agentpb_agent_proto_msgTypes = make([]protoimpl.MessageInfo, 89) + file_agentpb_agent_proto_msgTypes = make([]protoimpl.MessageInfo, 91) file_agentpb_agent_proto_goTypes = []interface{}{ (MysqlExplainOutputFormat)(0), // 0: agent.MysqlExplainOutputFormat (StartActionRequest_RestartSystemServiceParams_SystemService)(0), // 1: agent.StartActionRequest.RestartSystemServiceParams.SystemService @@ -7604,226 +7825,233 @@ var ( (*AgentLogsResponse)(nil), // 25: agent.AgentLogsResponse (*CheckConnectionRequest)(nil), // 26: agent.CheckConnectionRequest (*CheckConnectionResponse)(nil), // 27: agent.CheckConnectionResponse - (*JobStatusRequest)(nil), // 28: agent.JobStatusRequest - (*JobStatusResponse)(nil), // 29: agent.JobStatusResponse - (*S3LocationConfig)(nil), // 30: agent.S3LocationConfig - (*FilesystemLocationConfig)(nil), // 31: agent.FilesystemLocationConfig - (*StartJobRequest)(nil), // 32: agent.StartJobRequest - (*StartJobResponse)(nil), // 33: agent.StartJobResponse - (*StopJobRequest)(nil), // 34: agent.StopJobRequest - (*StopJobResponse)(nil), // 35: agent.StopJobResponse - (*JobResult)(nil), // 36: agent.JobResult - (*JobProgress)(nil), // 37: agent.JobProgress - (*GetVersionsRequest)(nil), // 38: agent.GetVersionsRequest - (*GetVersionsResponse)(nil), // 39: agent.GetVersionsResponse - (*AgentMessage)(nil), // 40: agent.AgentMessage - (*ServerMessage)(nil), // 41: agent.ServerMessage - nil, // 42: agent.TextFiles.FilesEntry - (*SetStateRequest_AgentProcess)(nil), // 43: agent.SetStateRequest.AgentProcess - nil, // 44: agent.SetStateRequest.AgentProcessesEntry - (*SetStateRequest_BuiltinAgent)(nil), // 45: agent.SetStateRequest.BuiltinAgent - nil, // 46: agent.SetStateRequest.BuiltinAgentsEntry - nil, // 47: agent.SetStateRequest.AgentProcess.TextFilesEntry - nil, // 48: agent.QueryActionMap.MapEntry - (*StartActionRequest_MySQLExplainParams)(nil), // 49: agent.StartActionRequest.MySQLExplainParams - (*StartActionRequest_MySQLShowCreateTableParams)(nil), // 50: agent.StartActionRequest.MySQLShowCreateTableParams - (*StartActionRequest_MySQLShowTableStatusParams)(nil), // 51: agent.StartActionRequest.MySQLShowTableStatusParams - (*StartActionRequest_MySQLShowIndexParams)(nil), // 52: agent.StartActionRequest.MySQLShowIndexParams - (*StartActionRequest_PostgreSQLShowCreateTableParams)(nil), // 53: agent.StartActionRequest.PostgreSQLShowCreateTableParams - (*StartActionRequest_PostgreSQLShowIndexParams)(nil), // 54: agent.StartActionRequest.PostgreSQLShowIndexParams - (*StartActionRequest_MongoDBExplainParams)(nil), // 55: agent.StartActionRequest.MongoDBExplainParams - (*StartActionRequest_PTSummaryParams)(nil), // 56: agent.StartActionRequest.PTSummaryParams - (*StartActionRequest_PTPgSummaryParams)(nil), // 57: agent.StartActionRequest.PTPgSummaryParams - (*StartActionRequest_PTMongoDBSummaryParams)(nil), // 58: agent.StartActionRequest.PTMongoDBSummaryParams - (*StartActionRequest_PTMySQLSummaryParams)(nil), // 59: agent.StartActionRequest.PTMySQLSummaryParams - (*StartActionRequest_MySQLQueryShowParams)(nil), // 60: agent.StartActionRequest.MySQLQueryShowParams - (*StartActionRequest_MySQLQuerySelectParams)(nil), // 61: agent.StartActionRequest.MySQLQuerySelectParams - (*StartActionRequest_PostgreSQLQueryShowParams)(nil), // 62: agent.StartActionRequest.PostgreSQLQueryShowParams - (*StartActionRequest_PostgreSQLQuerySelectParams)(nil), // 63: agent.StartActionRequest.PostgreSQLQuerySelectParams - (*StartActionRequest_MongoDBQueryGetParameterParams)(nil), // 64: agent.StartActionRequest.MongoDBQueryGetParameterParams - (*StartActionRequest_MongoDBQueryBuildInfoParams)(nil), // 65: agent.StartActionRequest.MongoDBQueryBuildInfoParams - (*StartActionRequest_MongoDBQueryGetCmdLineOptsParams)(nil), // 66: agent.StartActionRequest.MongoDBQueryGetCmdLineOptsParams - (*StartActionRequest_MongoDBQueryReplSetGetStatusParams)(nil), // 67: agent.StartActionRequest.MongoDBQueryReplSetGetStatusParams - (*StartActionRequest_MongoDBQueryGetDiagnosticDataParams)(nil), // 68: agent.StartActionRequest.MongoDBQueryGetDiagnosticDataParams - (*StartActionRequest_RestartSystemServiceParams)(nil), // 69: agent.StartActionRequest.RestartSystemServiceParams - (*CheckConnectionResponse_Stats)(nil), // 70: agent.CheckConnectionResponse.Stats - (*StartJobRequest_MySQLBackup)(nil), // 71: agent.StartJobRequest.MySQLBackup - (*StartJobRequest_MySQLRestoreBackup)(nil), // 72: agent.StartJobRequest.MySQLRestoreBackup - (*StartJobRequest_MongoDBBackup)(nil), // 73: agent.StartJobRequest.MongoDBBackup - (*StartJobRequest_MongoDBRestoreBackup)(nil), // 74: agent.StartJobRequest.MongoDBRestoreBackup - (*JobResult_Error)(nil), // 75: agent.JobResult.Error - (*JobResult_MongoDBBackup)(nil), // 76: agent.JobResult.MongoDBBackup - (*JobResult_MySQLBackup)(nil), // 77: agent.JobResult.MySQLBackup - (*JobResult_MySQLRestoreBackup)(nil), // 78: agent.JobResult.MySQLRestoreBackup - (*JobResult_MongoDBRestoreBackup)(nil), // 79: agent.JobResult.MongoDBRestoreBackup - (*JobProgress_MySQLBackup)(nil), // 80: agent.JobProgress.MySQLBackup - (*JobProgress_MySQLRestoreBackup)(nil), // 81: agent.JobProgress.MySQLRestoreBackup - (*JobProgress_Logs)(nil), // 82: agent.JobProgress.Logs - (*GetVersionsRequest_MySQLd)(nil), // 83: agent.GetVersionsRequest.MySQLd - (*GetVersionsRequest_Xtrabackup)(nil), // 84: agent.GetVersionsRequest.Xtrabackup - (*GetVersionsRequest_Xbcloud)(nil), // 85: agent.GetVersionsRequest.Xbcloud - (*GetVersionsRequest_Qpress)(nil), // 86: agent.GetVersionsRequest.Qpress - (*GetVersionsRequest_MongoDB)(nil), // 87: agent.GetVersionsRequest.MongoDB - (*GetVersionsRequest_PBM)(nil), // 88: agent.GetVersionsRequest.PBM - (*GetVersionsRequest_Software)(nil), // 89: agent.GetVersionsRequest.Software - (*GetVersionsResponse_Version)(nil), // 90: agent.GetVersionsResponse.Version - (*timestamppb.Timestamp)(nil), // 91: google.protobuf.Timestamp - (*MetricsBucket)(nil), // 92: agent.MetricsBucket - (inventorypb.AgentStatus)(0), // 93: inventory.AgentStatus - (*durationpb.Duration)(nil), // 94: google.protobuf.Duration - (inventorypb.ServiceType)(0), // 95: inventory.ServiceType - (*status.Status)(nil), // 96: google.rpc.Status - (inventorypb.AgentType)(0), // 97: inventory.AgentType - (backup.DataModel)(0), // 98: backup.v1.DataModel - (*backup.PbmMetadata)(nil), // 99: backup.v1.PbmMetadata - (*backup.Metadata)(nil), // 100: backup.v1.Metadata + (*ServiceInfoRequest)(nil), // 28: agent.ServiceInfoRequest + (*ServiceInfoResponse)(nil), // 29: agent.ServiceInfoResponse + (*JobStatusRequest)(nil), // 30: agent.JobStatusRequest + (*JobStatusResponse)(nil), // 31: agent.JobStatusResponse + (*S3LocationConfig)(nil), // 32: agent.S3LocationConfig + (*FilesystemLocationConfig)(nil), // 33: agent.FilesystemLocationConfig + (*StartJobRequest)(nil), // 34: agent.StartJobRequest + (*StartJobResponse)(nil), // 35: agent.StartJobResponse + (*StopJobRequest)(nil), // 36: agent.StopJobRequest + (*StopJobResponse)(nil), // 37: agent.StopJobResponse + (*JobResult)(nil), // 38: agent.JobResult + (*JobProgress)(nil), // 39: agent.JobProgress + (*GetVersionsRequest)(nil), // 40: agent.GetVersionsRequest + (*GetVersionsResponse)(nil), // 41: agent.GetVersionsResponse + (*AgentMessage)(nil), // 42: agent.AgentMessage + (*ServerMessage)(nil), // 43: agent.ServerMessage + nil, // 44: agent.TextFiles.FilesEntry + (*SetStateRequest_AgentProcess)(nil), // 45: agent.SetStateRequest.AgentProcess + nil, // 46: agent.SetStateRequest.AgentProcessesEntry + (*SetStateRequest_BuiltinAgent)(nil), // 47: agent.SetStateRequest.BuiltinAgent + nil, // 48: agent.SetStateRequest.BuiltinAgentsEntry + nil, // 49: agent.SetStateRequest.AgentProcess.TextFilesEntry + nil, // 50: agent.QueryActionMap.MapEntry + (*StartActionRequest_MySQLExplainParams)(nil), // 51: agent.StartActionRequest.MySQLExplainParams + (*StartActionRequest_MySQLShowCreateTableParams)(nil), // 52: agent.StartActionRequest.MySQLShowCreateTableParams + (*StartActionRequest_MySQLShowTableStatusParams)(nil), // 53: agent.StartActionRequest.MySQLShowTableStatusParams + (*StartActionRequest_MySQLShowIndexParams)(nil), // 54: agent.StartActionRequest.MySQLShowIndexParams + (*StartActionRequest_PostgreSQLShowCreateTableParams)(nil), // 55: agent.StartActionRequest.PostgreSQLShowCreateTableParams + (*StartActionRequest_PostgreSQLShowIndexParams)(nil), // 56: agent.StartActionRequest.PostgreSQLShowIndexParams + (*StartActionRequest_MongoDBExplainParams)(nil), // 57: agent.StartActionRequest.MongoDBExplainParams + (*StartActionRequest_PTSummaryParams)(nil), // 58: agent.StartActionRequest.PTSummaryParams + (*StartActionRequest_PTPgSummaryParams)(nil), // 59: agent.StartActionRequest.PTPgSummaryParams + (*StartActionRequest_PTMongoDBSummaryParams)(nil), // 60: agent.StartActionRequest.PTMongoDBSummaryParams + (*StartActionRequest_PTMySQLSummaryParams)(nil), // 61: agent.StartActionRequest.PTMySQLSummaryParams + (*StartActionRequest_MySQLQueryShowParams)(nil), // 62: agent.StartActionRequest.MySQLQueryShowParams + (*StartActionRequest_MySQLQuerySelectParams)(nil), // 63: agent.StartActionRequest.MySQLQuerySelectParams + (*StartActionRequest_PostgreSQLQueryShowParams)(nil), // 64: agent.StartActionRequest.PostgreSQLQueryShowParams + (*StartActionRequest_PostgreSQLQuerySelectParams)(nil), // 65: agent.StartActionRequest.PostgreSQLQuerySelectParams + (*StartActionRequest_MongoDBQueryGetParameterParams)(nil), // 66: agent.StartActionRequest.MongoDBQueryGetParameterParams + (*StartActionRequest_MongoDBQueryBuildInfoParams)(nil), // 67: agent.StartActionRequest.MongoDBQueryBuildInfoParams + (*StartActionRequest_MongoDBQueryGetCmdLineOptsParams)(nil), // 68: agent.StartActionRequest.MongoDBQueryGetCmdLineOptsParams + (*StartActionRequest_MongoDBQueryReplSetGetStatusParams)(nil), // 69: agent.StartActionRequest.MongoDBQueryReplSetGetStatusParams + (*StartActionRequest_MongoDBQueryGetDiagnosticDataParams)(nil), // 70: agent.StartActionRequest.MongoDBQueryGetDiagnosticDataParams + (*StartActionRequest_RestartSystemServiceParams)(nil), // 71: agent.StartActionRequest.RestartSystemServiceParams + (*CheckConnectionResponse_Stats)(nil), // 72: agent.CheckConnectionResponse.Stats + (*StartJobRequest_MySQLBackup)(nil), // 73: agent.StartJobRequest.MySQLBackup + (*StartJobRequest_MySQLRestoreBackup)(nil), // 74: agent.StartJobRequest.MySQLRestoreBackup + (*StartJobRequest_MongoDBBackup)(nil), // 75: agent.StartJobRequest.MongoDBBackup + (*StartJobRequest_MongoDBRestoreBackup)(nil), // 76: agent.StartJobRequest.MongoDBRestoreBackup + (*JobResult_Error)(nil), // 77: agent.JobResult.Error + (*JobResult_MongoDBBackup)(nil), // 78: agent.JobResult.MongoDBBackup + (*JobResult_MySQLBackup)(nil), // 79: agent.JobResult.MySQLBackup + (*JobResult_MySQLRestoreBackup)(nil), // 80: agent.JobResult.MySQLRestoreBackup + (*JobResult_MongoDBRestoreBackup)(nil), // 81: agent.JobResult.MongoDBRestoreBackup + (*JobProgress_MySQLBackup)(nil), // 82: agent.JobProgress.MySQLBackup + (*JobProgress_MySQLRestoreBackup)(nil), // 83: agent.JobProgress.MySQLRestoreBackup + (*JobProgress_Logs)(nil), // 84: agent.JobProgress.Logs + (*GetVersionsRequest_MySQLd)(nil), // 85: agent.GetVersionsRequest.MySQLd + (*GetVersionsRequest_Xtrabackup)(nil), // 86: agent.GetVersionsRequest.Xtrabackup + (*GetVersionsRequest_Xbcloud)(nil), // 87: agent.GetVersionsRequest.Xbcloud + (*GetVersionsRequest_Qpress)(nil), // 88: agent.GetVersionsRequest.Qpress + (*GetVersionsRequest_MongoDB)(nil), // 89: agent.GetVersionsRequest.MongoDB + (*GetVersionsRequest_PBM)(nil), // 90: agent.GetVersionsRequest.PBM + (*GetVersionsRequest_Software)(nil), // 91: agent.GetVersionsRequest.Software + (*GetVersionsResponse_Version)(nil), // 92: agent.GetVersionsResponse.Version + (*timestamppb.Timestamp)(nil), // 93: google.protobuf.Timestamp + (*MetricsBucket)(nil), // 94: agent.MetricsBucket + (inventorypb.AgentStatus)(0), // 95: inventory.AgentStatus + (*durationpb.Duration)(nil), // 96: google.protobuf.Duration + (inventorypb.ServiceType)(0), // 97: inventory.ServiceType + (*status.Status)(nil), // 98: google.rpc.Status + (inventorypb.AgentType)(0), // 99: inventory.AgentType + (backup.DataModel)(0), // 100: backup.v1.DataModel + (*backup.PbmMetadata)(nil), // 101: backup.v1.PbmMetadata + (*backup.Metadata)(nil), // 102: backup.v1.Metadata } ) var file_agentpb_agent_proto_depIdxs = []int32{ - 42, // 0: agent.TextFiles.files:type_name -> agent.TextFiles.FilesEntry - 91, // 1: agent.Pong.current_time:type_name -> google.protobuf.Timestamp - 92, // 2: agent.QANCollectRequest.metrics_bucket:type_name -> agent.MetricsBucket - 93, // 3: agent.StateChangedRequest.status:type_name -> inventory.AgentStatus - 44, // 4: agent.SetStateRequest.agent_processes:type_name -> agent.SetStateRequest.AgentProcessesEntry - 46, // 5: agent.SetStateRequest.builtin_agents:type_name -> agent.SetStateRequest.BuiltinAgentsEntry - 91, // 6: agent.QueryActionValue.timestamp:type_name -> google.protobuf.Timestamp + 44, // 0: agent.TextFiles.files:type_name -> agent.TextFiles.FilesEntry + 93, // 1: agent.Pong.current_time:type_name -> google.protobuf.Timestamp + 94, // 2: agent.QANCollectRequest.metrics_bucket:type_name -> agent.MetricsBucket + 95, // 3: agent.StateChangedRequest.status:type_name -> inventory.AgentStatus + 46, // 4: agent.SetStateRequest.agent_processes:type_name -> agent.SetStateRequest.AgentProcessesEntry + 48, // 5: agent.SetStateRequest.builtin_agents:type_name -> agent.SetStateRequest.BuiltinAgentsEntry + 93, // 6: agent.QueryActionValue.timestamp:type_name -> google.protobuf.Timestamp 12, // 7: agent.QueryActionValue.slice:type_name -> agent.QueryActionSlice 13, // 8: agent.QueryActionValue.map:type_name -> agent.QueryActionMap 14, // 9: agent.QueryActionValue.binary:type_name -> agent.QueryActionBinary 11, // 10: agent.QueryActionSlice.slice:type_name -> agent.QueryActionValue - 48, // 11: agent.QueryActionMap.map:type_name -> agent.QueryActionMap.MapEntry + 50, // 11: agent.QueryActionMap.map:type_name -> agent.QueryActionMap.MapEntry 12, // 12: agent.QueryActionResult.rows:type_name -> agent.QueryActionSlice 13, // 13: agent.QueryActionResult.docs:type_name -> agent.QueryActionMap - 49, // 14: agent.StartActionRequest.mysql_explain_params:type_name -> agent.StartActionRequest.MySQLExplainParams - 50, // 15: agent.StartActionRequest.mysql_show_create_table_params:type_name -> agent.StartActionRequest.MySQLShowCreateTableParams - 51, // 16: agent.StartActionRequest.mysql_show_table_status_params:type_name -> agent.StartActionRequest.MySQLShowTableStatusParams - 52, // 17: agent.StartActionRequest.mysql_show_index_params:type_name -> agent.StartActionRequest.MySQLShowIndexParams - 53, // 18: agent.StartActionRequest.postgresql_show_create_table_params:type_name -> agent.StartActionRequest.PostgreSQLShowCreateTableParams - 54, // 19: agent.StartActionRequest.postgresql_show_index_params:type_name -> agent.StartActionRequest.PostgreSQLShowIndexParams - 55, // 20: agent.StartActionRequest.mongodb_explain_params:type_name -> agent.StartActionRequest.MongoDBExplainParams - 56, // 21: agent.StartActionRequest.pt_summary_params:type_name -> agent.StartActionRequest.PTSummaryParams - 57, // 22: agent.StartActionRequest.pt_pg_summary_params:type_name -> agent.StartActionRequest.PTPgSummaryParams - 58, // 23: agent.StartActionRequest.pt_mongodb_summary_params:type_name -> agent.StartActionRequest.PTMongoDBSummaryParams - 59, // 24: agent.StartActionRequest.pt_mysql_summary_params:type_name -> agent.StartActionRequest.PTMySQLSummaryParams - 60, // 25: agent.StartActionRequest.mysql_query_show_params:type_name -> agent.StartActionRequest.MySQLQueryShowParams - 61, // 26: agent.StartActionRequest.mysql_query_select_params:type_name -> agent.StartActionRequest.MySQLQuerySelectParams - 62, // 27: agent.StartActionRequest.postgresql_query_show_params:type_name -> agent.StartActionRequest.PostgreSQLQueryShowParams - 63, // 28: agent.StartActionRequest.postgresql_query_select_params:type_name -> agent.StartActionRequest.PostgreSQLQuerySelectParams - 64, // 29: agent.StartActionRequest.mongodb_query_getparameter_params:type_name -> agent.StartActionRequest.MongoDBQueryGetParameterParams - 65, // 30: agent.StartActionRequest.mongodb_query_buildinfo_params:type_name -> agent.StartActionRequest.MongoDBQueryBuildInfoParams - 66, // 31: agent.StartActionRequest.mongodb_query_getcmdlineopts_params:type_name -> agent.StartActionRequest.MongoDBQueryGetCmdLineOptsParams - 67, // 32: agent.StartActionRequest.mongodb_query_replsetgetstatus_params:type_name -> agent.StartActionRequest.MongoDBQueryReplSetGetStatusParams - 68, // 33: agent.StartActionRequest.mongodb_query_getdiagnosticdata_params:type_name -> agent.StartActionRequest.MongoDBQueryGetDiagnosticDataParams - 69, // 34: agent.StartActionRequest.restart_sys_service_params:type_name -> agent.StartActionRequest.RestartSystemServiceParams - 94, // 35: agent.StartActionRequest.timeout:type_name -> google.protobuf.Duration + 51, // 14: agent.StartActionRequest.mysql_explain_params:type_name -> agent.StartActionRequest.MySQLExplainParams + 52, // 15: agent.StartActionRequest.mysql_show_create_table_params:type_name -> agent.StartActionRequest.MySQLShowCreateTableParams + 53, // 16: agent.StartActionRequest.mysql_show_table_status_params:type_name -> agent.StartActionRequest.MySQLShowTableStatusParams + 54, // 17: agent.StartActionRequest.mysql_show_index_params:type_name -> agent.StartActionRequest.MySQLShowIndexParams + 55, // 18: agent.StartActionRequest.postgresql_show_create_table_params:type_name -> agent.StartActionRequest.PostgreSQLShowCreateTableParams + 56, // 19: agent.StartActionRequest.postgresql_show_index_params:type_name -> agent.StartActionRequest.PostgreSQLShowIndexParams + 57, // 20: agent.StartActionRequest.mongodb_explain_params:type_name -> agent.StartActionRequest.MongoDBExplainParams + 58, // 21: agent.StartActionRequest.pt_summary_params:type_name -> agent.StartActionRequest.PTSummaryParams + 59, // 22: agent.StartActionRequest.pt_pg_summary_params:type_name -> agent.StartActionRequest.PTPgSummaryParams + 60, // 23: agent.StartActionRequest.pt_mongodb_summary_params:type_name -> agent.StartActionRequest.PTMongoDBSummaryParams + 61, // 24: agent.StartActionRequest.pt_mysql_summary_params:type_name -> agent.StartActionRequest.PTMySQLSummaryParams + 62, // 25: agent.StartActionRequest.mysql_query_show_params:type_name -> agent.StartActionRequest.MySQLQueryShowParams + 63, // 26: agent.StartActionRequest.mysql_query_select_params:type_name -> agent.StartActionRequest.MySQLQuerySelectParams + 64, // 27: agent.StartActionRequest.postgresql_query_show_params:type_name -> agent.StartActionRequest.PostgreSQLQueryShowParams + 65, // 28: agent.StartActionRequest.postgresql_query_select_params:type_name -> agent.StartActionRequest.PostgreSQLQuerySelectParams + 66, // 29: agent.StartActionRequest.mongodb_query_getparameter_params:type_name -> agent.StartActionRequest.MongoDBQueryGetParameterParams + 67, // 30: agent.StartActionRequest.mongodb_query_buildinfo_params:type_name -> agent.StartActionRequest.MongoDBQueryBuildInfoParams + 68, // 31: agent.StartActionRequest.mongodb_query_getcmdlineopts_params:type_name -> agent.StartActionRequest.MongoDBQueryGetCmdLineOptsParams + 69, // 32: agent.StartActionRequest.mongodb_query_replsetgetstatus_params:type_name -> agent.StartActionRequest.MongoDBQueryReplSetGetStatusParams + 70, // 33: agent.StartActionRequest.mongodb_query_getdiagnosticdata_params:type_name -> agent.StartActionRequest.MongoDBQueryGetDiagnosticDataParams + 71, // 34: agent.StartActionRequest.restart_sys_service_params:type_name -> agent.StartActionRequest.RestartSystemServiceParams + 96, // 35: agent.StartActionRequest.timeout:type_name -> google.protobuf.Duration 2, // 36: agent.PBMSwitchPITRRequest.text_files:type_name -> agent.TextFiles - 95, // 37: agent.CheckConnectionRequest.type:type_name -> inventory.ServiceType - 94, // 38: agent.CheckConnectionRequest.timeout:type_name -> google.protobuf.Duration + 97, // 37: agent.CheckConnectionRequest.type:type_name -> inventory.ServiceType + 96, // 38: agent.CheckConnectionRequest.timeout:type_name -> google.protobuf.Duration 2, // 39: agent.CheckConnectionRequest.text_files:type_name -> agent.TextFiles - 70, // 40: agent.CheckConnectionResponse.stats:type_name -> agent.CheckConnectionResponse.Stats - 94, // 41: agent.StartJobRequest.timeout:type_name -> google.protobuf.Duration - 71, // 42: agent.StartJobRequest.mysql_backup:type_name -> agent.StartJobRequest.MySQLBackup - 72, // 43: agent.StartJobRequest.mysql_restore_backup:type_name -> agent.StartJobRequest.MySQLRestoreBackup - 73, // 44: agent.StartJobRequest.mongodb_backup:type_name -> agent.StartJobRequest.MongoDBBackup - 74, // 45: agent.StartJobRequest.mongodb_restore_backup:type_name -> agent.StartJobRequest.MongoDBRestoreBackup - 91, // 46: agent.JobResult.timestamp:type_name -> google.protobuf.Timestamp - 75, // 47: agent.JobResult.error:type_name -> agent.JobResult.Error - 77, // 48: agent.JobResult.mysql_backup:type_name -> agent.JobResult.MySQLBackup - 78, // 49: agent.JobResult.mysql_restore_backup:type_name -> agent.JobResult.MySQLRestoreBackup - 76, // 50: agent.JobResult.mongodb_backup:type_name -> agent.JobResult.MongoDBBackup - 79, // 51: agent.JobResult.mongodb_restore_backup:type_name -> agent.JobResult.MongoDBRestoreBackup - 91, // 52: agent.JobProgress.timestamp:type_name -> google.protobuf.Timestamp - 80, // 53: agent.JobProgress.mysql_backup:type_name -> agent.JobProgress.MySQLBackup - 81, // 54: agent.JobProgress.mysql_restore_backup:type_name -> agent.JobProgress.MySQLRestoreBackup - 82, // 55: agent.JobProgress.logs:type_name -> agent.JobProgress.Logs - 89, // 56: agent.GetVersionsRequest.softwares:type_name -> agent.GetVersionsRequest.Software - 90, // 57: agent.GetVersionsResponse.versions:type_name -> agent.GetVersionsResponse.Version - 96, // 58: agent.AgentMessage.status:type_name -> google.rpc.Status - 3, // 59: agent.AgentMessage.ping:type_name -> agent.Ping - 7, // 60: agent.AgentMessage.state_changed:type_name -> agent.StateChangedRequest - 5, // 61: agent.AgentMessage.qan_collect:type_name -> agent.QANCollectRequest - 20, // 62: agent.AgentMessage.action_result:type_name -> agent.ActionResultRequest - 36, // 63: agent.AgentMessage.job_result:type_name -> agent.JobResult - 37, // 64: agent.AgentMessage.job_progress:type_name -> agent.JobProgress - 4, // 65: agent.AgentMessage.pong:type_name -> agent.Pong - 10, // 66: agent.AgentMessage.set_state:type_name -> agent.SetStateResponse - 17, // 67: agent.AgentMessage.start_action:type_name -> agent.StartActionResponse - 19, // 68: agent.AgentMessage.stop_action:type_name -> agent.StopActionResponse - 27, // 69: agent.AgentMessage.check_connection:type_name -> agent.CheckConnectionResponse - 33, // 70: agent.AgentMessage.start_job:type_name -> agent.StartJobResponse - 35, // 71: agent.AgentMessage.stop_job:type_name -> agent.StopJobResponse - 29, // 72: agent.AgentMessage.job_status:type_name -> agent.JobStatusResponse - 39, // 73: agent.AgentMessage.get_versions:type_name -> agent.GetVersionsResponse - 23, // 74: agent.AgentMessage.pbm_switch_pitr:type_name -> agent.PBMSwitchPITRResponse - 25, // 75: agent.AgentMessage.agent_logs:type_name -> agent.AgentLogsResponse - 96, // 76: agent.ServerMessage.status:type_name -> google.rpc.Status - 4, // 77: agent.ServerMessage.pong:type_name -> agent.Pong - 8, // 78: agent.ServerMessage.state_changed:type_name -> agent.StateChangedResponse - 6, // 79: agent.ServerMessage.qan_collect:type_name -> agent.QANCollectResponse - 21, // 80: agent.ServerMessage.action_result:type_name -> agent.ActionResultResponse - 3, // 81: agent.ServerMessage.ping:type_name -> agent.Ping - 9, // 82: agent.ServerMessage.set_state:type_name -> agent.SetStateRequest - 16, // 83: agent.ServerMessage.start_action:type_name -> agent.StartActionRequest - 18, // 84: agent.ServerMessage.stop_action:type_name -> agent.StopActionRequest - 26, // 85: agent.ServerMessage.check_connection:type_name -> agent.CheckConnectionRequest - 32, // 86: agent.ServerMessage.start_job:type_name -> agent.StartJobRequest - 34, // 87: agent.ServerMessage.stop_job:type_name -> agent.StopJobRequest - 28, // 88: agent.ServerMessage.job_status:type_name -> agent.JobStatusRequest - 38, // 89: agent.ServerMessage.get_versions:type_name -> agent.GetVersionsRequest - 22, // 90: agent.ServerMessage.pbm_switch_pitr:type_name -> agent.PBMSwitchPITRRequest - 24, // 91: agent.ServerMessage.agent_logs:type_name -> agent.AgentLogsRequest - 97, // 92: agent.SetStateRequest.AgentProcess.type:type_name -> inventory.AgentType - 47, // 93: agent.SetStateRequest.AgentProcess.text_files:type_name -> agent.SetStateRequest.AgentProcess.TextFilesEntry - 43, // 94: agent.SetStateRequest.AgentProcessesEntry.value:type_name -> agent.SetStateRequest.AgentProcess - 97, // 95: agent.SetStateRequest.BuiltinAgent.type:type_name -> inventory.AgentType - 2, // 96: agent.SetStateRequest.BuiltinAgent.text_files:type_name -> agent.TextFiles - 45, // 97: agent.SetStateRequest.BuiltinAgentsEntry.value:type_name -> agent.SetStateRequest.BuiltinAgent - 11, // 98: agent.QueryActionMap.MapEntry.value:type_name -> agent.QueryActionValue - 0, // 99: agent.StartActionRequest.MySQLExplainParams.output_format:type_name -> agent.MysqlExplainOutputFormat - 2, // 100: agent.StartActionRequest.MySQLExplainParams.tls_files:type_name -> agent.TextFiles - 2, // 101: agent.StartActionRequest.MySQLShowCreateTableParams.tls_files:type_name -> agent.TextFiles - 2, // 102: agent.StartActionRequest.MySQLShowTableStatusParams.tls_files:type_name -> agent.TextFiles - 2, // 103: agent.StartActionRequest.MySQLShowIndexParams.tls_files:type_name -> agent.TextFiles - 2, // 104: agent.StartActionRequest.PostgreSQLShowCreateTableParams.tls_files:type_name -> agent.TextFiles - 2, // 105: agent.StartActionRequest.PostgreSQLShowIndexParams.tls_files:type_name -> agent.TextFiles - 2, // 106: agent.StartActionRequest.MongoDBExplainParams.text_files:type_name -> agent.TextFiles - 2, // 107: agent.StartActionRequest.MySQLQueryShowParams.tls_files:type_name -> agent.TextFiles - 2, // 108: agent.StartActionRequest.MySQLQuerySelectParams.tls_files:type_name -> agent.TextFiles - 2, // 109: agent.StartActionRequest.PostgreSQLQueryShowParams.tls_files:type_name -> agent.TextFiles - 2, // 110: agent.StartActionRequest.PostgreSQLQuerySelectParams.tls_files:type_name -> agent.TextFiles - 2, // 111: agent.StartActionRequest.MongoDBQueryGetParameterParams.text_files:type_name -> agent.TextFiles - 2, // 112: agent.StartActionRequest.MongoDBQueryBuildInfoParams.text_files:type_name -> agent.TextFiles - 2, // 113: agent.StartActionRequest.MongoDBQueryGetCmdLineOptsParams.text_files:type_name -> agent.TextFiles - 2, // 114: agent.StartActionRequest.MongoDBQueryReplSetGetStatusParams.text_files:type_name -> agent.TextFiles - 2, // 115: agent.StartActionRequest.MongoDBQueryGetDiagnosticDataParams.text_files:type_name -> agent.TextFiles - 1, // 116: agent.StartActionRequest.RestartSystemServiceParams.system_service:type_name -> agent.StartActionRequest.RestartSystemServiceParams.SystemService - 30, // 117: agent.StartJobRequest.MySQLBackup.s3_config:type_name -> agent.S3LocationConfig - 30, // 118: agent.StartJobRequest.MySQLRestoreBackup.s3_config:type_name -> agent.S3LocationConfig - 98, // 119: agent.StartJobRequest.MongoDBBackup.data_model:type_name -> backup.v1.DataModel - 30, // 120: agent.StartJobRequest.MongoDBBackup.s3_config:type_name -> agent.S3LocationConfig - 31, // 121: agent.StartJobRequest.MongoDBBackup.filesystem_config:type_name -> agent.FilesystemLocationConfig - 2, // 122: agent.StartJobRequest.MongoDBBackup.text_files:type_name -> agent.TextFiles - 91, // 123: agent.StartJobRequest.MongoDBRestoreBackup.pitr_timestamp:type_name -> google.protobuf.Timestamp - 30, // 124: agent.StartJobRequest.MongoDBRestoreBackup.s3_config:type_name -> agent.S3LocationConfig - 31, // 125: agent.StartJobRequest.MongoDBRestoreBackup.filesystem_config:type_name -> agent.FilesystemLocationConfig - 99, // 126: agent.StartJobRequest.MongoDBRestoreBackup.pbm_metadata:type_name -> backup.v1.PbmMetadata - 2, // 127: agent.StartJobRequest.MongoDBRestoreBackup.text_files:type_name -> agent.TextFiles - 100, // 128: agent.JobResult.MongoDBBackup.metadata:type_name -> backup.v1.Metadata - 100, // 129: agent.JobResult.MySQLBackup.metadata:type_name -> backup.v1.Metadata - 83, // 130: agent.GetVersionsRequest.Software.mysqld:type_name -> agent.GetVersionsRequest.MySQLd - 84, // 131: agent.GetVersionsRequest.Software.xtrabackup:type_name -> agent.GetVersionsRequest.Xtrabackup - 85, // 132: agent.GetVersionsRequest.Software.xbcloud:type_name -> agent.GetVersionsRequest.Xbcloud - 86, // 133: agent.GetVersionsRequest.Software.qpress:type_name -> agent.GetVersionsRequest.Qpress - 87, // 134: agent.GetVersionsRequest.Software.mongod:type_name -> agent.GetVersionsRequest.MongoDB - 88, // 135: agent.GetVersionsRequest.Software.pbm:type_name -> agent.GetVersionsRequest.PBM - 40, // 136: agent.Agent.Connect:input_type -> agent.AgentMessage - 41, // 137: agent.Agent.Connect:output_type -> agent.ServerMessage - 137, // [137:138] is the sub-list for method output_type - 136, // [136:137] is the sub-list for method input_type - 136, // [136:136] is the sub-list for extension type_name - 136, // [136:136] is the sub-list for extension extendee - 0, // [0:136] is the sub-list for field type_name + 72, // 40: agent.CheckConnectionResponse.stats:type_name -> agent.CheckConnectionResponse.Stats + 97, // 41: agent.ServiceInfoRequest.type:type_name -> inventory.ServiceType + 96, // 42: agent.ServiceInfoRequest.timeout:type_name -> google.protobuf.Duration + 2, // 43: agent.ServiceInfoRequest.text_files:type_name -> agent.TextFiles + 96, // 44: agent.StartJobRequest.timeout:type_name -> google.protobuf.Duration + 73, // 45: agent.StartJobRequest.mysql_backup:type_name -> agent.StartJobRequest.MySQLBackup + 74, // 46: agent.StartJobRequest.mysql_restore_backup:type_name -> agent.StartJobRequest.MySQLRestoreBackup + 75, // 47: agent.StartJobRequest.mongodb_backup:type_name -> agent.StartJobRequest.MongoDBBackup + 76, // 48: agent.StartJobRequest.mongodb_restore_backup:type_name -> agent.StartJobRequest.MongoDBRestoreBackup + 93, // 49: agent.JobResult.timestamp:type_name -> google.protobuf.Timestamp + 77, // 50: agent.JobResult.error:type_name -> agent.JobResult.Error + 79, // 51: agent.JobResult.mysql_backup:type_name -> agent.JobResult.MySQLBackup + 80, // 52: agent.JobResult.mysql_restore_backup:type_name -> agent.JobResult.MySQLRestoreBackup + 78, // 53: agent.JobResult.mongodb_backup:type_name -> agent.JobResult.MongoDBBackup + 81, // 54: agent.JobResult.mongodb_restore_backup:type_name -> agent.JobResult.MongoDBRestoreBackup + 93, // 55: agent.JobProgress.timestamp:type_name -> google.protobuf.Timestamp + 82, // 56: agent.JobProgress.mysql_backup:type_name -> agent.JobProgress.MySQLBackup + 83, // 57: agent.JobProgress.mysql_restore_backup:type_name -> agent.JobProgress.MySQLRestoreBackup + 84, // 58: agent.JobProgress.logs:type_name -> agent.JobProgress.Logs + 91, // 59: agent.GetVersionsRequest.softwares:type_name -> agent.GetVersionsRequest.Software + 92, // 60: agent.GetVersionsResponse.versions:type_name -> agent.GetVersionsResponse.Version + 98, // 61: agent.AgentMessage.status:type_name -> google.rpc.Status + 3, // 62: agent.AgentMessage.ping:type_name -> agent.Ping + 7, // 63: agent.AgentMessage.state_changed:type_name -> agent.StateChangedRequest + 5, // 64: agent.AgentMessage.qan_collect:type_name -> agent.QANCollectRequest + 20, // 65: agent.AgentMessage.action_result:type_name -> agent.ActionResultRequest + 38, // 66: agent.AgentMessage.job_result:type_name -> agent.JobResult + 39, // 67: agent.AgentMessage.job_progress:type_name -> agent.JobProgress + 4, // 68: agent.AgentMessage.pong:type_name -> agent.Pong + 10, // 69: agent.AgentMessage.set_state:type_name -> agent.SetStateResponse + 17, // 70: agent.AgentMessage.start_action:type_name -> agent.StartActionResponse + 19, // 71: agent.AgentMessage.stop_action:type_name -> agent.StopActionResponse + 27, // 72: agent.AgentMessage.check_connection:type_name -> agent.CheckConnectionResponse + 35, // 73: agent.AgentMessage.start_job:type_name -> agent.StartJobResponse + 37, // 74: agent.AgentMessage.stop_job:type_name -> agent.StopJobResponse + 31, // 75: agent.AgentMessage.job_status:type_name -> agent.JobStatusResponse + 41, // 76: agent.AgentMessage.get_versions:type_name -> agent.GetVersionsResponse + 23, // 77: agent.AgentMessage.pbm_switch_pitr:type_name -> agent.PBMSwitchPITRResponse + 25, // 78: agent.AgentMessage.agent_logs:type_name -> agent.AgentLogsResponse + 29, // 79: agent.AgentMessage.service_info:type_name -> agent.ServiceInfoResponse + 98, // 80: agent.ServerMessage.status:type_name -> google.rpc.Status + 4, // 81: agent.ServerMessage.pong:type_name -> agent.Pong + 8, // 82: agent.ServerMessage.state_changed:type_name -> agent.StateChangedResponse + 6, // 83: agent.ServerMessage.qan_collect:type_name -> agent.QANCollectResponse + 21, // 84: agent.ServerMessage.action_result:type_name -> agent.ActionResultResponse + 3, // 85: agent.ServerMessage.ping:type_name -> agent.Ping + 9, // 86: agent.ServerMessage.set_state:type_name -> agent.SetStateRequest + 16, // 87: agent.ServerMessage.start_action:type_name -> agent.StartActionRequest + 18, // 88: agent.ServerMessage.stop_action:type_name -> agent.StopActionRequest + 26, // 89: agent.ServerMessage.check_connection:type_name -> agent.CheckConnectionRequest + 34, // 90: agent.ServerMessage.start_job:type_name -> agent.StartJobRequest + 36, // 91: agent.ServerMessage.stop_job:type_name -> agent.StopJobRequest + 30, // 92: agent.ServerMessage.job_status:type_name -> agent.JobStatusRequest + 40, // 93: agent.ServerMessage.get_versions:type_name -> agent.GetVersionsRequest + 22, // 94: agent.ServerMessage.pbm_switch_pitr:type_name -> agent.PBMSwitchPITRRequest + 24, // 95: agent.ServerMessage.agent_logs:type_name -> agent.AgentLogsRequest + 28, // 96: agent.ServerMessage.service_info:type_name -> agent.ServiceInfoRequest + 99, // 97: agent.SetStateRequest.AgentProcess.type:type_name -> inventory.AgentType + 49, // 98: agent.SetStateRequest.AgentProcess.text_files:type_name -> agent.SetStateRequest.AgentProcess.TextFilesEntry + 45, // 99: agent.SetStateRequest.AgentProcessesEntry.value:type_name -> agent.SetStateRequest.AgentProcess + 99, // 100: agent.SetStateRequest.BuiltinAgent.type:type_name -> inventory.AgentType + 2, // 101: agent.SetStateRequest.BuiltinAgent.text_files:type_name -> agent.TextFiles + 47, // 102: agent.SetStateRequest.BuiltinAgentsEntry.value:type_name -> agent.SetStateRequest.BuiltinAgent + 11, // 103: agent.QueryActionMap.MapEntry.value:type_name -> agent.QueryActionValue + 0, // 104: agent.StartActionRequest.MySQLExplainParams.output_format:type_name -> agent.MysqlExplainOutputFormat + 2, // 105: agent.StartActionRequest.MySQLExplainParams.tls_files:type_name -> agent.TextFiles + 2, // 106: agent.StartActionRequest.MySQLShowCreateTableParams.tls_files:type_name -> agent.TextFiles + 2, // 107: agent.StartActionRequest.MySQLShowTableStatusParams.tls_files:type_name -> agent.TextFiles + 2, // 108: agent.StartActionRequest.MySQLShowIndexParams.tls_files:type_name -> agent.TextFiles + 2, // 109: agent.StartActionRequest.PostgreSQLShowCreateTableParams.tls_files:type_name -> agent.TextFiles + 2, // 110: agent.StartActionRequest.PostgreSQLShowIndexParams.tls_files:type_name -> agent.TextFiles + 2, // 111: agent.StartActionRequest.MongoDBExplainParams.text_files:type_name -> agent.TextFiles + 2, // 112: agent.StartActionRequest.MySQLQueryShowParams.tls_files:type_name -> agent.TextFiles + 2, // 113: agent.StartActionRequest.MySQLQuerySelectParams.tls_files:type_name -> agent.TextFiles + 2, // 114: agent.StartActionRequest.PostgreSQLQueryShowParams.tls_files:type_name -> agent.TextFiles + 2, // 115: agent.StartActionRequest.PostgreSQLQuerySelectParams.tls_files:type_name -> agent.TextFiles + 2, // 116: agent.StartActionRequest.MongoDBQueryGetParameterParams.text_files:type_name -> agent.TextFiles + 2, // 117: agent.StartActionRequest.MongoDBQueryBuildInfoParams.text_files:type_name -> agent.TextFiles + 2, // 118: agent.StartActionRequest.MongoDBQueryGetCmdLineOptsParams.text_files:type_name -> agent.TextFiles + 2, // 119: agent.StartActionRequest.MongoDBQueryReplSetGetStatusParams.text_files:type_name -> agent.TextFiles + 2, // 120: agent.StartActionRequest.MongoDBQueryGetDiagnosticDataParams.text_files:type_name -> agent.TextFiles + 1, // 121: agent.StartActionRequest.RestartSystemServiceParams.system_service:type_name -> agent.StartActionRequest.RestartSystemServiceParams.SystemService + 32, // 122: agent.StartJobRequest.MySQLBackup.s3_config:type_name -> agent.S3LocationConfig + 32, // 123: agent.StartJobRequest.MySQLRestoreBackup.s3_config:type_name -> agent.S3LocationConfig + 100, // 124: agent.StartJobRequest.MongoDBBackup.data_model:type_name -> backup.v1.DataModel + 32, // 125: agent.StartJobRequest.MongoDBBackup.s3_config:type_name -> agent.S3LocationConfig + 33, // 126: agent.StartJobRequest.MongoDBBackup.filesystem_config:type_name -> agent.FilesystemLocationConfig + 2, // 127: agent.StartJobRequest.MongoDBBackup.text_files:type_name -> agent.TextFiles + 93, // 128: agent.StartJobRequest.MongoDBRestoreBackup.pitr_timestamp:type_name -> google.protobuf.Timestamp + 32, // 129: agent.StartJobRequest.MongoDBRestoreBackup.s3_config:type_name -> agent.S3LocationConfig + 33, // 130: agent.StartJobRequest.MongoDBRestoreBackup.filesystem_config:type_name -> agent.FilesystemLocationConfig + 101, // 131: agent.StartJobRequest.MongoDBRestoreBackup.pbm_metadata:type_name -> backup.v1.PbmMetadata + 2, // 132: agent.StartJobRequest.MongoDBRestoreBackup.text_files:type_name -> agent.TextFiles + 102, // 133: agent.JobResult.MongoDBBackup.metadata:type_name -> backup.v1.Metadata + 102, // 134: agent.JobResult.MySQLBackup.metadata:type_name -> backup.v1.Metadata + 85, // 135: agent.GetVersionsRequest.Software.mysqld:type_name -> agent.GetVersionsRequest.MySQLd + 86, // 136: agent.GetVersionsRequest.Software.xtrabackup:type_name -> agent.GetVersionsRequest.Xtrabackup + 87, // 137: agent.GetVersionsRequest.Software.xbcloud:type_name -> agent.GetVersionsRequest.Xbcloud + 88, // 138: agent.GetVersionsRequest.Software.qpress:type_name -> agent.GetVersionsRequest.Qpress + 89, // 139: agent.GetVersionsRequest.Software.mongod:type_name -> agent.GetVersionsRequest.MongoDB + 90, // 140: agent.GetVersionsRequest.Software.pbm:type_name -> agent.GetVersionsRequest.PBM + 42, // 141: agent.Agent.Connect:input_type -> agent.AgentMessage + 43, // 142: agent.Agent.Connect:output_type -> agent.ServerMessage + 142, // [142:143] is the sub-list for method output_type + 141, // [141:142] is the sub-list for method input_type + 141, // [141:141] is the sub-list for extension type_name + 141, // [141:141] is the sub-list for extension extendee + 0, // [0:141] is the sub-list for field type_name } func init() { file_agentpb_agent_proto_init() } @@ -8146,7 +8374,7 @@ func file_agentpb_agent_proto_init() { } } file_agentpb_agent_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*JobStatusRequest); i { + switch v := v.(*ServiceInfoRequest); i { case 0: return &v.state case 1: @@ -8158,7 +8386,7 @@ func file_agentpb_agent_proto_init() { } } file_agentpb_agent_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*JobStatusResponse); i { + switch v := v.(*ServiceInfoResponse); i { case 0: return &v.state case 1: @@ -8170,7 +8398,7 @@ func file_agentpb_agent_proto_init() { } } file_agentpb_agent_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*S3LocationConfig); i { + switch v := v.(*JobStatusRequest); i { case 0: return &v.state case 1: @@ -8182,7 +8410,7 @@ func file_agentpb_agent_proto_init() { } } file_agentpb_agent_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FilesystemLocationConfig); i { + switch v := v.(*JobStatusResponse); i { case 0: return &v.state case 1: @@ -8194,7 +8422,7 @@ func file_agentpb_agent_proto_init() { } } file_agentpb_agent_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StartJobRequest); i { + switch v := v.(*S3LocationConfig); i { case 0: return &v.state case 1: @@ -8206,7 +8434,7 @@ func file_agentpb_agent_proto_init() { } } file_agentpb_agent_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StartJobResponse); i { + switch v := v.(*FilesystemLocationConfig); i { case 0: return &v.state case 1: @@ -8218,7 +8446,7 @@ func file_agentpb_agent_proto_init() { } } file_agentpb_agent_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StopJobRequest); i { + switch v := v.(*StartJobRequest); i { case 0: return &v.state case 1: @@ -8230,7 +8458,7 @@ func file_agentpb_agent_proto_init() { } } file_agentpb_agent_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StopJobResponse); i { + switch v := v.(*StartJobResponse); i { case 0: return &v.state case 1: @@ -8242,7 +8470,7 @@ func file_agentpb_agent_proto_init() { } } file_agentpb_agent_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*JobResult); i { + switch v := v.(*StopJobRequest); i { case 0: return &v.state case 1: @@ -8254,7 +8482,7 @@ func file_agentpb_agent_proto_init() { } } file_agentpb_agent_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*JobProgress); i { + switch v := v.(*StopJobResponse); i { case 0: return &v.state case 1: @@ -8266,7 +8494,7 @@ func file_agentpb_agent_proto_init() { } } file_agentpb_agent_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetVersionsRequest); i { + switch v := v.(*JobResult); i { case 0: return &v.state case 1: @@ -8278,7 +8506,7 @@ func file_agentpb_agent_proto_init() { } } file_agentpb_agent_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetVersionsResponse); i { + switch v := v.(*JobProgress); i { case 0: return &v.state case 1: @@ -8290,7 +8518,7 @@ func file_agentpb_agent_proto_init() { } } file_agentpb_agent_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AgentMessage); i { + switch v := v.(*GetVersionsRequest); i { case 0: return &v.state case 1: @@ -8302,7 +8530,19 @@ func file_agentpb_agent_proto_init() { } } file_agentpb_agent_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ServerMessage); i { + switch v := v.(*GetVersionsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_agentpb_agent_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AgentMessage); i { case 0: return &v.state case 1: @@ -8314,7 +8554,7 @@ func file_agentpb_agent_proto_init() { } } file_agentpb_agent_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetStateRequest_AgentProcess); i { + switch v := v.(*ServerMessage); i { case 0: return &v.state case 1: @@ -8326,6 +8566,18 @@ func file_agentpb_agent_proto_init() { } } file_agentpb_agent_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SetStateRequest_AgentProcess); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_agentpb_agent_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SetStateRequest_BuiltinAgent); i { case 0: return &v.state @@ -8337,7 +8589,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StartActionRequest_MySQLExplainParams); i { case 0: return &v.state @@ -8349,7 +8601,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StartActionRequest_MySQLShowCreateTableParams); i { case 0: return &v.state @@ -8361,7 +8613,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StartActionRequest_MySQLShowTableStatusParams); i { case 0: return &v.state @@ -8373,7 +8625,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StartActionRequest_MySQLShowIndexParams); i { case 0: return &v.state @@ -8385,7 +8637,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StartActionRequest_PostgreSQLShowCreateTableParams); i { case 0: return &v.state @@ -8397,7 +8649,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StartActionRequest_PostgreSQLShowIndexParams); i { case 0: return &v.state @@ -8409,7 +8661,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StartActionRequest_MongoDBExplainParams); i { case 0: return &v.state @@ -8421,7 +8673,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StartActionRequest_PTSummaryParams); i { case 0: return &v.state @@ -8433,7 +8685,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StartActionRequest_PTPgSummaryParams); i { case 0: return &v.state @@ -8445,7 +8697,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StartActionRequest_PTMongoDBSummaryParams); i { case 0: return &v.state @@ -8457,7 +8709,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StartActionRequest_PTMySQLSummaryParams); i { case 0: return &v.state @@ -8469,7 +8721,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StartActionRequest_MySQLQueryShowParams); i { case 0: return &v.state @@ -8481,7 +8733,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StartActionRequest_MySQLQuerySelectParams); i { case 0: return &v.state @@ -8493,7 +8745,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StartActionRequest_PostgreSQLQueryShowParams); i { case 0: return &v.state @@ -8505,7 +8757,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StartActionRequest_PostgreSQLQuerySelectParams); i { case 0: return &v.state @@ -8517,7 +8769,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StartActionRequest_MongoDBQueryGetParameterParams); i { case 0: return &v.state @@ -8529,7 +8781,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StartActionRequest_MongoDBQueryBuildInfoParams); i { case 0: return &v.state @@ -8541,7 +8793,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StartActionRequest_MongoDBQueryGetCmdLineOptsParams); i { case 0: return &v.state @@ -8553,7 +8805,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StartActionRequest_MongoDBQueryReplSetGetStatusParams); i { case 0: return &v.state @@ -8565,7 +8817,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StartActionRequest_MongoDBQueryGetDiagnosticDataParams); i { case 0: return &v.state @@ -8577,7 +8829,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StartActionRequest_RestartSystemServiceParams); i { case 0: return &v.state @@ -8589,7 +8841,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CheckConnectionResponse_Stats); i { case 0: return &v.state @@ -8601,7 +8853,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StartJobRequest_MySQLBackup); i { case 0: return &v.state @@ -8613,7 +8865,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StartJobRequest_MySQLRestoreBackup); i { case 0: return &v.state @@ -8625,7 +8877,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StartJobRequest_MongoDBBackup); i { case 0: return &v.state @@ -8637,7 +8889,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StartJobRequest_MongoDBRestoreBackup); i { case 0: return &v.state @@ -8649,7 +8901,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*JobResult_Error); i { case 0: return &v.state @@ -8661,7 +8913,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*JobResult_MongoDBBackup); i { case 0: return &v.state @@ -8673,7 +8925,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*JobResult_MySQLBackup); i { case 0: return &v.state @@ -8685,7 +8937,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*JobResult_MySQLRestoreBackup); i { case 0: return &v.state @@ -8697,7 +8949,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*JobResult_MongoDBRestoreBackup); i { case 0: return &v.state @@ -8709,7 +8961,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*JobProgress_MySQLBackup); i { case 0: return &v.state @@ -8721,7 +8973,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*JobProgress_MySQLRestoreBackup); i { case 0: return &v.state @@ -8733,7 +8985,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*JobProgress_Logs); i { case 0: return &v.state @@ -8745,7 +8997,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetVersionsRequest_MySQLd); i { case 0: return &v.state @@ -8757,7 +9009,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[84].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetVersionsRequest_Xtrabackup); i { case 0: return &v.state @@ -8769,7 +9021,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[85].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetVersionsRequest_Xbcloud); i { case 0: return &v.state @@ -8781,7 +9033,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[84].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[86].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetVersionsRequest_Qpress); i { case 0: return &v.state @@ -8793,7 +9045,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[85].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[87].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetVersionsRequest_MongoDB); i { case 0: return &v.state @@ -8805,7 +9057,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[86].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[88].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetVersionsRequest_PBM); i { case 0: return &v.state @@ -8817,7 +9069,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[87].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[89].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetVersionsRequest_Software); i { case 0: return &v.state @@ -8829,7 +9081,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[88].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[90].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetVersionsResponse_Version); i { case 0: return &v.state @@ -8877,25 +9129,25 @@ func file_agentpb_agent_proto_init() { (*StartActionRequest_MongodbQueryGetdiagnosticdataParams)(nil), (*StartActionRequest_RestartSysServiceParams)(nil), } - file_agentpb_agent_proto_msgTypes[30].OneofWrappers = []interface{}{ + file_agentpb_agent_proto_msgTypes[32].OneofWrappers = []interface{}{ (*StartJobRequest_MysqlBackup)(nil), (*StartJobRequest_MysqlRestoreBackup)(nil), (*StartJobRequest_MongodbBackup)(nil), (*StartJobRequest_MongodbRestoreBackup)(nil), } - file_agentpb_agent_proto_msgTypes[34].OneofWrappers = []interface{}{ + file_agentpb_agent_proto_msgTypes[36].OneofWrappers = []interface{}{ (*JobResult_Error_)(nil), (*JobResult_MysqlBackup)(nil), (*JobResult_MysqlRestoreBackup)(nil), (*JobResult_MongodbBackup)(nil), (*JobResult_MongodbRestoreBackup)(nil), } - file_agentpb_agent_proto_msgTypes[35].OneofWrappers = []interface{}{ + file_agentpb_agent_proto_msgTypes[37].OneofWrappers = []interface{}{ (*JobProgress_MysqlBackup)(nil), (*JobProgress_MysqlRestoreBackup)(nil), (*JobProgress_Logs_)(nil), } - file_agentpb_agent_proto_msgTypes[38].OneofWrappers = []interface{}{ + file_agentpb_agent_proto_msgTypes[40].OneofWrappers = []interface{}{ (*AgentMessage_Ping)(nil), (*AgentMessage_StateChanged)(nil), (*AgentMessage_QanCollect)(nil), @@ -8913,8 +9165,9 @@ func file_agentpb_agent_proto_init() { (*AgentMessage_GetVersions)(nil), (*AgentMessage_PbmSwitchPitr)(nil), (*AgentMessage_AgentLogs)(nil), + (*AgentMessage_ServiceInfo)(nil), } - file_agentpb_agent_proto_msgTypes[39].OneofWrappers = []interface{}{ + file_agentpb_agent_proto_msgTypes[41].OneofWrappers = []interface{}{ (*ServerMessage_Pong)(nil), (*ServerMessage_StateChanged)(nil), (*ServerMessage_QanCollect)(nil), @@ -8930,22 +9183,23 @@ func file_agentpb_agent_proto_init() { (*ServerMessage_GetVersions)(nil), (*ServerMessage_PbmSwitchPitr)(nil), (*ServerMessage_AgentLogs)(nil), + (*ServerMessage_ServiceInfo)(nil), } - file_agentpb_agent_proto_msgTypes[69].OneofWrappers = []interface{}{ + file_agentpb_agent_proto_msgTypes[71].OneofWrappers = []interface{}{ (*StartJobRequest_MySQLBackup_S3Config)(nil), } - file_agentpb_agent_proto_msgTypes[70].OneofWrappers = []interface{}{ + file_agentpb_agent_proto_msgTypes[72].OneofWrappers = []interface{}{ (*StartJobRequest_MySQLRestoreBackup_S3Config)(nil), } - file_agentpb_agent_proto_msgTypes[71].OneofWrappers = []interface{}{ + file_agentpb_agent_proto_msgTypes[73].OneofWrappers = []interface{}{ (*StartJobRequest_MongoDBBackup_S3Config)(nil), (*StartJobRequest_MongoDBBackup_FilesystemConfig)(nil), } - file_agentpb_agent_proto_msgTypes[72].OneofWrappers = []interface{}{ + file_agentpb_agent_proto_msgTypes[74].OneofWrappers = []interface{}{ (*StartJobRequest_MongoDBRestoreBackup_S3Config)(nil), (*StartJobRequest_MongoDBRestoreBackup_FilesystemConfig)(nil), } - file_agentpb_agent_proto_msgTypes[87].OneofWrappers = []interface{}{ + file_agentpb_agent_proto_msgTypes[89].OneofWrappers = []interface{}{ (*GetVersionsRequest_Software_Mysqld)(nil), (*GetVersionsRequest_Software_Xtrabackup)(nil), (*GetVersionsRequest_Software_Xbcloud)(nil), @@ -8959,7 +9213,7 @@ func file_agentpb_agent_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_agentpb_agent_proto_rawDesc, NumEnums: 2, - NumMessages: 89, + NumMessages: 91, NumExtensions: 0, NumServices: 1, }, diff --git a/api/agentpb/agent.pb.validate.go b/api/agentpb/agent.pb.validate.go index 75971959e9..069d003037 100644 --- a/api/agentpb/agent.pb.validate.go +++ b/api/agentpb/agent.pb.validate.go @@ -4278,6 +4278,280 @@ var _ interface { ErrorName() string } = CheckConnectionResponseValidationError{} +// Validate checks the field values on ServiceInfoRequest with the rules +// defined in the proto definition for this message. If any rules are +// violated, the first error encountered is returned, or nil if there are no violations. +func (m *ServiceInfoRequest) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on ServiceInfoRequest with the rules +// defined in the proto definition for this message. If any rules are +// violated, the result is a list of violation errors wrapped in +// ServiceInfoRequestMultiError, or nil if none found. +func (m *ServiceInfoRequest) ValidateAll() error { + return m.validate(true) +} + +func (m *ServiceInfoRequest) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + // no validation rules for Type + + // no validation rules for Dsn + + if all { + switch v := interface{}(m.GetTimeout()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, ServiceInfoRequestValidationError{ + field: "Timeout", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, ServiceInfoRequestValidationError{ + field: "Timeout", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetTimeout()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return ServiceInfoRequestValidationError{ + field: "Timeout", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if all { + switch v := interface{}(m.GetTextFiles()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, ServiceInfoRequestValidationError{ + field: "TextFiles", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, ServiceInfoRequestValidationError{ + field: "TextFiles", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetTextFiles()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return ServiceInfoRequestValidationError{ + field: "TextFiles", + reason: "embedded message failed validation", + cause: err, + } + } + } + + // no validation rules for TlsSkipVerify + + if len(errors) > 0 { + return ServiceInfoRequestMultiError(errors) + } + + return nil +} + +// ServiceInfoRequestMultiError is an error wrapping multiple validation errors +// returned by ServiceInfoRequest.ValidateAll() if the designated constraints +// aren't met. +type ServiceInfoRequestMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m ServiceInfoRequestMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m ServiceInfoRequestMultiError) AllErrors() []error { return m } + +// ServiceInfoRequestValidationError is the validation error returned by +// ServiceInfoRequest.Validate if the designated constraints aren't met. +type ServiceInfoRequestValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e ServiceInfoRequestValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e ServiceInfoRequestValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e ServiceInfoRequestValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e ServiceInfoRequestValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e ServiceInfoRequestValidationError) ErrorName() string { + return "ServiceInfoRequestValidationError" +} + +// Error satisfies the builtin error interface +func (e ServiceInfoRequestValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sServiceInfoRequest.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = ServiceInfoRequestValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = ServiceInfoRequestValidationError{} + +// Validate checks the field values on ServiceInfoResponse with the rules +// defined in the proto definition for this message. If any rules are +// violated, the first error encountered is returned, or nil if there are no violations. +func (m *ServiceInfoResponse) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on ServiceInfoResponse with the rules +// defined in the proto definition for this message. If any rules are +// violated, the result is a list of violation errors wrapped in +// ServiceInfoResponseMultiError, or nil if none found. +func (m *ServiceInfoResponse) ValidateAll() error { + return m.validate(true) +} + +func (m *ServiceInfoResponse) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + // no validation rules for Error + + // no validation rules for TableCount + + // no validation rules for Version + + if len(errors) > 0 { + return ServiceInfoResponseMultiError(errors) + } + + return nil +} + +// ServiceInfoResponseMultiError is an error wrapping multiple validation +// errors returned by ServiceInfoResponse.ValidateAll() if the designated +// constraints aren't met. +type ServiceInfoResponseMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m ServiceInfoResponseMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m ServiceInfoResponseMultiError) AllErrors() []error { return m } + +// ServiceInfoResponseValidationError is the validation error returned by +// ServiceInfoResponse.Validate if the designated constraints aren't met. +type ServiceInfoResponseValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e ServiceInfoResponseValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e ServiceInfoResponseValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e ServiceInfoResponseValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e ServiceInfoResponseValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e ServiceInfoResponseValidationError) ErrorName() string { + return "ServiceInfoResponseValidationError" +} + +// Error satisfies the builtin error interface +func (e ServiceInfoResponseValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sServiceInfoResponse.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = ServiceInfoResponseValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = ServiceInfoResponseValidationError{} + // Validate checks the field values on JobStatusRequest with the rules defined // in the proto definition for this message. If any rules are violated, the // first error encountered is returned, or nil if there are no violations. @@ -6923,6 +7197,47 @@ func (m *AgentMessage) validate(all bool) error { } } + case *AgentMessage_ServiceInfo: + if v == nil { + err := AgentMessageValidationError{ + field: "Payload", + reason: "oneof value cannot be a typed-nil", + } + if !all { + return err + } + errors = append(errors, err) + } + + if all { + switch v := interface{}(m.GetServiceInfo()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, AgentMessageValidationError{ + field: "ServiceInfo", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, AgentMessageValidationError{ + field: "ServiceInfo", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetServiceInfo()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return AgentMessageValidationError{ + field: "ServiceInfo", + reason: "embedded message failed validation", + cause: err, + } + } + } + default: _ = v // ensures v is used } @@ -7673,6 +7988,47 @@ func (m *ServerMessage) validate(all bool) error { } } + case *ServerMessage_ServiceInfo: + if v == nil { + err := ServerMessageValidationError{ + field: "Payload", + reason: "oneof value cannot be a typed-nil", + } + if !all { + return err + } + errors = append(errors, err) + } + + if all { + switch v := interface{}(m.GetServiceInfo()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, ServerMessageValidationError{ + field: "ServiceInfo", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, ServerMessageValidationError{ + field: "ServiceInfo", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetServiceInfo()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return ServerMessageValidationError{ + field: "ServiceInfo", + reason: "embedded message failed validation", + cause: err, + } + } + } + default: _ = v // ensures v is used } @@ -10893,6 +11249,8 @@ func (m *CheckConnectionResponse_Stats) validate(all bool) error { // no validation rules for TableCount + // no validation rules for Version + if len(errors) > 0 { return CheckConnectionResponse_StatsMultiError(errors) } diff --git a/api/agentpb/agent.proto b/api/agentpb/agent.proto index 737640c198..2d991cff99 100644 --- a/api/agentpb/agent.proto +++ b/api/agentpb/agent.proto @@ -438,16 +438,41 @@ message CheckConnectionRequest { bool tls_skip_verify = 5; } -// CheckConnectionResponse is an AgentMessage containing a result of connection check. +// CheckConnectionResponse is an AgentMessage containing the result of a connection check. message CheckConnectionResponse { // Stats contains various Service statistics. message Stats { // A number of tables, 0 if unknown. int32 table_count = 1; + string version = 2; } // Error message if connection check failed. string error = 1; - Stats stats = 2; + Stats stats = 2 [deprecated = true]; +} + +// ServiceInfoRequest is a ServerMessage that queries pmm-agent for database information. +message ServiceInfoRequest { + // Service type. + inventory.ServiceType type = 1; + // DSN for the service. May contain connection (dial) timeout. + string dsn = 2; + // Timeout for the whole request. + google.protobuf.Duration timeout = 3; + // Contains files and their contents which can be used in DSN. + TextFiles text_files = 4; + // TLS certificate wont be verified. + bool tls_skip_verify = 5; +} + +// ServiceInfoResponse is an AgentMessage containing information gathered from a service. +message ServiceInfoResponse { + // Error message if the request failed. + string error = 1; + // A number of MySQL tables, 0 if unknown. + int32 table_count = 2; + // Database server version. + string version = 3; } // JobStatusRequest is a ServerMessage asking pmm-agent for job status. @@ -710,8 +735,6 @@ message GetVersionsResponse { } message AgentMessage { - // TODO https://jira.percona.com/browse/PMM-3449 - uint32 id = 1; // The responder sets the status field in two situations: // 1. When it received a request with the payload field not set. @@ -739,12 +762,11 @@ message AgentMessage { GetVersionsResponse get_versions = 18; PBMSwitchPITRResponse pbm_switch_pitr = 19; AgentLogsResponse agent_logs = 21; + ServiceInfoResponse service_info = 22; } } message ServerMessage { - // TODO https://jira.percona.com/browse/PMM-3449 - uint32 id = 1; // The responder sets the status field in two situations: // 1. When it received a request with the payload field not set. @@ -770,6 +792,7 @@ message ServerMessage { GetVersionsRequest get_versions = 16; PBMSwitchPITRRequest pbm_switch_pitr = 17; AgentLogsRequest agent_logs = 19; + ServiceInfoRequest service_info = 20; } } diff --git a/api/inventorypb/json/client/services/add_mongo_db_service_responses.go b/api/inventorypb/json/client/services/add_mongo_db_service_responses.go index 2f0a715d74..9bc049120f 100644 --- a/api/inventorypb/json/client/services/add_mongo_db_service_responses.go +++ b/api/inventorypb/json/client/services/add_mongo_db_service_responses.go @@ -449,6 +449,9 @@ type AddMongoDBServiceOKBodyMongodb struct { // Custom user-assigned labels. CustomLabels map[string]string `json:"custom_labels,omitempty"` + + // MongoDB version. + Version string `json:"version,omitempty"` } // Validate validates this add mongo DB service OK body mongodb diff --git a/api/inventorypb/json/client/services/add_my_sql_service_responses.go b/api/inventorypb/json/client/services/add_my_sql_service_responses.go index d3e8511769..ea4d4bc211 100644 --- a/api/inventorypb/json/client/services/add_my_sql_service_responses.go +++ b/api/inventorypb/json/client/services/add_my_sql_service_responses.go @@ -449,6 +449,9 @@ type AddMySQLServiceOKBodyMysql struct { // Custom user-assigned labels. CustomLabels map[string]string `json:"custom_labels,omitempty"` + + // MySQL version. + Version string `json:"version,omitempty"` } // Validate validates this add my SQL service OK body mysql diff --git a/api/inventorypb/json/client/services/add_postgre_sql_service_responses.go b/api/inventorypb/json/client/services/add_postgre_sql_service_responses.go index c704610153..334dedbf33 100644 --- a/api/inventorypb/json/client/services/add_postgre_sql_service_responses.go +++ b/api/inventorypb/json/client/services/add_postgre_sql_service_responses.go @@ -452,6 +452,9 @@ type AddPostgreSQLServiceOKBodyPostgresql struct { // Custom user-assigned labels. CustomLabels map[string]string `json:"custom_labels,omitempty"` + + // PostgreSQL version. + Version string `json:"version,omitempty"` } // Validate validates this add postgre SQL service OK body postgresql diff --git a/api/inventorypb/json/client/services/add_proxy_sql_service_responses.go b/api/inventorypb/json/client/services/add_proxy_sql_service_responses.go index 4bd65d4a30..a8e751259e 100644 --- a/api/inventorypb/json/client/services/add_proxy_sql_service_responses.go +++ b/api/inventorypb/json/client/services/add_proxy_sql_service_responses.go @@ -449,6 +449,9 @@ type AddProxySQLServiceOKBodyProxysql struct { // Custom user-assigned labels. CustomLabels map[string]string `json:"custom_labels,omitempty"` + + // ProxySQL version. + Version string `json:"version,omitempty"` } // Validate validates this add proxy SQL service OK body proxysql diff --git a/api/inventorypb/json/client/services/get_service_responses.go b/api/inventorypb/json/client/services/get_service_responses.go index 5249f7e578..da75bcd52b 100644 --- a/api/inventorypb/json/client/services/get_service_responses.go +++ b/api/inventorypb/json/client/services/get_service_responses.go @@ -760,6 +760,9 @@ type GetServiceOKBodyMongodb struct { // Custom user-assigned labels. CustomLabels map[string]string `json:"custom_labels,omitempty"` + + // MongoDB version. + Version string `json:"version,omitempty"` } // Validate validates this get service OK body mongodb @@ -827,6 +830,9 @@ type GetServiceOKBodyMysql struct { // Custom user-assigned labels. CustomLabels map[string]string `json:"custom_labels,omitempty"` + + // MySQL version. + Version string `json:"version,omitempty"` } // Validate validates this get service OK body mysql @@ -897,6 +903,9 @@ type GetServiceOKBodyPostgresql struct { // Custom user-assigned labels. CustomLabels map[string]string `json:"custom_labels,omitempty"` + + // PostgreSQL version. + Version string `json:"version,omitempty"` } // Validate validates this get service OK body postgresql @@ -964,6 +973,9 @@ type GetServiceOKBodyProxysql struct { // Custom user-assigned labels. CustomLabels map[string]string `json:"custom_labels,omitempty"` + + // ProxySQL version. + Version string `json:"version,omitempty"` } // Validate validates this get service OK body proxysql diff --git a/api/inventorypb/json/client/services/list_services_responses.go b/api/inventorypb/json/client/services/list_services_responses.go index d7d093f09d..13c39e0205 100644 --- a/api/inventorypb/json/client/services/list_services_responses.go +++ b/api/inventorypb/json/client/services/list_services_responses.go @@ -889,6 +889,9 @@ type ListServicesOKBodyMongodbItems0 struct { // Custom user-assigned labels. CustomLabels map[string]string `json:"custom_labels,omitempty"` + + // MongoDB version. + Version string `json:"version,omitempty"` } // Validate validates this list services OK body mongodb items0 @@ -956,6 +959,9 @@ type ListServicesOKBodyMysqlItems0 struct { // Custom user-assigned labels. CustomLabels map[string]string `json:"custom_labels,omitempty"` + + // MySQL version. + Version string `json:"version,omitempty"` } // Validate validates this list services OK body mysql items0 @@ -1026,6 +1032,9 @@ type ListServicesOKBodyPostgresqlItems0 struct { // Custom user-assigned labels. CustomLabels map[string]string `json:"custom_labels,omitempty"` + + // PostgreSQL version. + Version string `json:"version,omitempty"` } // Validate validates this list services OK body postgresql items0 @@ -1093,6 +1102,9 @@ type ListServicesOKBodyProxysqlItems0 struct { // Custom user-assigned labels. CustomLabels map[string]string `json:"custom_labels,omitempty"` + + // ProxySQL version. + Version string `json:"version,omitempty"` } // Validate validates this list services OK body proxysql items0 diff --git a/api/inventorypb/json/inventorypb.json b/api/inventorypb/json/inventorypb.json index f1cbb4024b..bb4239d488 100644 --- a/api/inventorypb/json/inventorypb.json +++ b/api/inventorypb/json/inventorypb.json @@ -11604,6 +11604,11 @@ "description": "Access unix socket.\nAddress (and port) or socket is required.", "type": "string", "x-order": 5 + }, + "version": { + "description": "MongoDB version.", + "type": "string", + "x-order": 10 } }, "x-order": 0 @@ -11777,6 +11782,11 @@ "description": "Access unix socket.\nAddress (and port) or socket is required.", "type": "string", "x-order": 5 + }, + "version": { + "description": "MySQL version.", + "type": "string", + "x-order": 10 } }, "x-order": 0 @@ -11955,6 +11965,11 @@ "description": "Access unix socket.\nAddress (and port) or socket is required.", "type": "string", "x-order": 6 + }, + "version": { + "description": "PostgreSQL version.", + "type": "string", + "x-order": 11 } }, "x-order": 0 @@ -12128,6 +12143,11 @@ "description": "Access unix socket.\nAddress (and port) or socket is required.", "type": "string", "x-order": 5 + }, + "version": { + "description": "ProxySQL version.", + "type": "string", + "x-order": 10 } }, "x-order": 0 @@ -12581,6 +12601,11 @@ "description": "Access unix socket.\nAddress (and port) or socket is required.", "type": "string", "x-order": 5 + }, + "version": { + "description": "MongoDB version.", + "type": "string", + "x-order": 10 } }, "x-order": 1 @@ -12642,6 +12667,11 @@ "description": "Access unix socket.\nAddress (and port) or socket is required.", "type": "string", "x-order": 5 + }, + "version": { + "description": "MySQL version.", + "type": "string", + "x-order": 10 } }, "x-order": 0 @@ -12708,6 +12738,11 @@ "description": "Access unix socket.\nAddress (and port) or socket is required.", "type": "string", "x-order": 6 + }, + "version": { + "description": "PostgreSQL version.", + "type": "string", + "x-order": 11 } }, "x-order": 2 @@ -12769,6 +12804,11 @@ "description": "Access unix socket.\nAddress (and port) or socket is required.", "type": "string", "x-order": 5 + }, + "version": { + "description": "ProxySQL version.", + "type": "string", + "x-order": 10 } }, "x-order": 3 @@ -13021,6 +13061,11 @@ "description": "Access unix socket.\nAddress (and port) or socket is required.", "type": "string", "x-order": 5 + }, + "version": { + "description": "MongoDB version.", + "type": "string", + "x-order": 10 } } }, @@ -13085,6 +13130,11 @@ "description": "Access unix socket.\nAddress (and port) or socket is required.", "type": "string", "x-order": 5 + }, + "version": { + "description": "MySQL version.", + "type": "string", + "x-order": 10 } } }, @@ -13154,6 +13204,11 @@ "description": "Access unix socket.\nAddress (and port) or socket is required.", "type": "string", "x-order": 6 + }, + "version": { + "description": "PostgreSQL version.", + "type": "string", + "x-order": 11 } } }, @@ -13218,6 +13273,11 @@ "description": "Access unix socket.\nAddress (and port) or socket is required.", "type": "string", "x-order": 5 + }, + "version": { + "description": "ProxySQL version.", + "type": "string", + "x-order": 10 } } }, diff --git a/api/inventorypb/services.pb.go b/api/inventorypb/services.pb.go index bf39b9164e..46aabb2016 100644 --- a/api/inventorypb/services.pb.go +++ b/api/inventorypb/services.pb.go @@ -115,6 +115,8 @@ type MySQLService struct { ReplicationSet string `protobuf:"bytes,8,opt,name=replication_set,json=replicationSet,proto3" json:"replication_set,omitempty"` // Custom user-assigned labels. CustomLabels map[string]string `protobuf:"bytes,9,rep,name=custom_labels,json=customLabels,proto3" json:"custom_labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // MySQL version. + Version string `protobuf:"bytes,11,opt,name=version,proto3" json:"version,omitempty"` } func (x *MySQLService) Reset() { @@ -219,6 +221,13 @@ func (x *MySQLService) GetCustomLabels() map[string]string { return nil } +func (x *MySQLService) GetVersion() string { + if x != nil { + return x.Version + } + return "" +} + // MongoDBService represents a generic MongoDB instance. type MongoDBService struct { state protoimpl.MessageState @@ -248,6 +257,8 @@ type MongoDBService struct { ReplicationSet string `protobuf:"bytes,8,opt,name=replication_set,json=replicationSet,proto3" json:"replication_set,omitempty"` // Custom user-assigned labels. CustomLabels map[string]string `protobuf:"bytes,9,rep,name=custom_labels,json=customLabels,proto3" json:"custom_labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // MongoDB version. + Version string `protobuf:"bytes,11,opt,name=version,proto3" json:"version,omitempty"` } func (x *MongoDBService) Reset() { @@ -352,6 +363,13 @@ func (x *MongoDBService) GetCustomLabels() map[string]string { return nil } +func (x *MongoDBService) GetVersion() string { + if x != nil { + return x.Version + } + return "" +} + // PostgreSQLService represents a generic PostgreSQL instance. type PostgreSQLService struct { state protoimpl.MessageState @@ -383,6 +401,8 @@ type PostgreSQLService struct { ReplicationSet string `protobuf:"bytes,8,opt,name=replication_set,json=replicationSet,proto3" json:"replication_set,omitempty"` // Custom user-assigned labels. CustomLabels map[string]string `protobuf:"bytes,9,rep,name=custom_labels,json=customLabels,proto3" json:"custom_labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // PostgreSQL version. + Version string `protobuf:"bytes,12,opt,name=version,proto3" json:"version,omitempty"` } func (x *PostgreSQLService) Reset() { @@ -494,6 +514,13 @@ func (x *PostgreSQLService) GetCustomLabels() map[string]string { return nil } +func (x *PostgreSQLService) GetVersion() string { + if x != nil { + return x.Version + } + return "" +} + // ProxySQLService represents a generic ProxySQL instance. type ProxySQLService struct { state protoimpl.MessageState @@ -523,6 +550,8 @@ type ProxySQLService struct { ReplicationSet string `protobuf:"bytes,8,opt,name=replication_set,json=replicationSet,proto3" json:"replication_set,omitempty"` // Custom user-assigned labels. CustomLabels map[string]string `protobuf:"bytes,9,rep,name=custom_labels,json=customLabels,proto3" json:"custom_labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // ProxySQL version. + Version string `protobuf:"bytes,11,opt,name=version,proto3" json:"version,omitempty"` } func (x *ProxySQLService) Reset() { @@ -627,6 +656,13 @@ func (x *ProxySQLService) GetCustomLabels() map[string]string { return nil } +func (x *ProxySQLService) GetVersion() string { + if x != nil { + return x.Version + } + return "" +} + // HAProxyService represents a generic HAProxy service instance. type HAProxyService struct { state protoimpl.MessageState @@ -2647,7 +2683,7 @@ var file_inventorypb_services_proto_rawDesc = []byte{ 0x6e, 0x2d, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, - 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa5, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xbf, 0x03, 0x0a, 0x0c, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x21, @@ -2670,305 +2706,214 @@ var file_inventorypb_services_proto_rawDesc = []byte{ 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, - 0x61, 0x62, 0x65, 0x6c, 0x73, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, + 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x1a, + 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0xc3, 0x03, 0x0a, 0x0e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x18, + 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, + 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, + 0x63, 0x6b, 0x65, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x73, 0x65, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x12, 0x50, 0x0a, 0x0d, 0x63, 0x75, 0x73, + 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x2b, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4d, 0x6f, 0x6e, + 0x67, 0x6f, 0x44, 0x42, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x43, 0x75, 0x73, 0x74, + 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, + 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa9, 0x03, 0x0a, 0x0e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, - 0x44, 0x42, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x6e, - 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, - 0x64, 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x12, - 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x6f, - 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x0a, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, - 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x12, - 0x50, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, - 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, - 0x72, 0x79, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, - 0x73, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0xd4, 0x03, 0x0a, 0x11, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, - 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x20, - 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x53, 0x65, 0x74, 0x12, 0x53, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, - 0x62, 0x65, 0x6c, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x69, 0x6e, 0x76, - 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, - 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, - 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, - 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, - 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xab, 0x03, 0x0a, 0x0f, 0x50, 0x72, - 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1d, 0x0a, - 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x20, - 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x53, 0x65, 0x74, 0x12, 0x51, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, - 0x62, 0x65, 0x6c, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6e, 0x76, - 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, - 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, - 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xee, 0x03, 0x0a, 0x11, 0x50, 0x6f, 0x73, 0x74, 0x67, + 0x72, 0x65, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, + 0x0a, 0x0d, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, + 0x63, 0x6b, 0x65, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x63, 0x6b, + 0x65, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x27, + 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, + 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x12, 0x53, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, + 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, + 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x67, + 0x72, 0x65, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x43, 0x75, 0x73, + 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, + 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x18, 0x0a, 0x07, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xe3, 0x02, 0x0a, 0x0e, 0x48, 0x41, 0x50, 0x72, - 0x6f, 0x78, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x17, 0x0a, 0x07, - 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, - 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x73, 0x65, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x12, 0x50, 0x0a, 0x0d, 0x63, 0x75, - 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x2b, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x48, 0x41, - 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x43, 0x75, 0x73, - 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, - 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x1a, 0x3f, 0x0a, 0x11, - 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xfb, 0x02, - 0x0a, 0x0f, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, - 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, - 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xc5, 0x03, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x78, + 0x79, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x17, 0x0a, + 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, + 0x70, 0x6f, 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x0a, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x20, 0x0a, 0x0b, + 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x18, - 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x12, 0x51, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, - 0x6c, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, - 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, 0x65, 0x72, + 0x6c, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, + 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, - 0x62, 0x65, 0x6c, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, - 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x90, 0x01, 0x0a, 0x13, - 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x39, 0x0a, 0x0c, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x78, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0d, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x22, 0xdd, - 0x02, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x6d, 0x79, 0x73, 0x71, 0x6c, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, - 0x72, 0x79, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, - 0x05, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x12, 0x33, 0x0a, 0x07, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, - 0x62, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, - 0x6f, 0x72, 0x79, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x52, 0x07, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x12, 0x3c, 0x0a, 0x0a, 0x70, - 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1c, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x50, 0x6f, 0x73, 0x74, - 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x0a, 0x70, - 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x12, 0x36, 0x0a, 0x08, 0x70, 0x72, 0x6f, - 0x78, 0x79, 0x73, 0x71, 0x6c, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6e, - 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, - 0x6c, 0x12, 0x33, 0x0a, 0x07, 0x68, 0x61, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x18, 0x07, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x48, - 0x41, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x07, 0x68, - 0x61, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x12, 0x36, 0x0a, 0x08, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, - 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x52, 0x08, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x22, 0x1f, - 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, - 0x5d, 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x3b, 0x0a, 0x0d, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, - 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, - 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, - 0x52, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x22, 0x3b, - 0x0a, 0x11, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, - 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x22, 0xf2, 0x02, 0x0a, 0x12, - 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x05, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4d, 0x79, - 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x48, 0x00, 0x52, 0x05, 0x6d, 0x79, - 0x73, 0x71, 0x6c, 0x12, 0x35, 0x0a, 0x07, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, - 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x48, - 0x00, 0x52, 0x07, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x12, 0x3e, 0x0a, 0x0a, 0x70, 0x6f, - 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, - 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x67, - 0x72, 0x65, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x48, 0x00, 0x52, 0x0a, - 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x12, 0x38, 0x0a, 0x08, 0x70, 0x72, - 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, - 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, - 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x48, 0x00, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x78, - 0x79, 0x73, 0x71, 0x6c, 0x12, 0x35, 0x0a, 0x07, 0x68, 0x61, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, - 0x79, 0x2e, 0x48, 0x41, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x48, 0x00, 0x52, 0x07, 0x68, 0x61, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x12, 0x38, 0x0a, 0x08, 0x65, - 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x48, 0x00, 0x52, 0x08, 0x65, 0x78, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x42, 0x09, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x22, 0xac, 0x03, 0x0a, 0x16, 0x41, 0x64, 0x64, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x0c, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, - 0x01, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, - 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x12, - 0x20, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x72, - 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x53, 0x65, 0x74, 0x12, 0x58, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, - 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6e, - 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x4d, 0x79, 0x53, 0x51, 0x4c, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, - 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x1a, 0x3f, + 0x62, 0x65, 0x6c, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0x48, 0x0a, 0x17, 0x41, 0x64, 0x64, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x6d, 0x79, + 0xe3, 0x02, 0x0a, 0x0e, 0x48, 0x41, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, + 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x20, 0x0a, + 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, + 0x18, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, + 0x65, 0x74, 0x12, 0x50, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, + 0x65, 0x6c, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x69, 0x6e, 0x76, 0x65, + 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x48, 0x41, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, + 0x62, 0x65, 0x6c, 0x73, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, + 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xfb, 0x02, 0x0a, 0x0f, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x6e, + 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, + 0x64, 0x65, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x73, 0x65, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x12, 0x51, 0x0a, 0x0d, 0x63, 0x75, 0x73, + 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x2c, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x45, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x43, 0x75, 0x73, + 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, + 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x14, 0x0a, 0x05, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x67, 0x72, 0x6f, + 0x75, 0x70, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, + 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0x90, 0x01, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x6e, + 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, + 0x64, 0x65, 0x49, 0x64, 0x12, 0x39, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, + 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, + 0x70, 0x65, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x25, 0x0a, 0x0e, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x22, 0xdd, 0x02, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x2d, 0x0a, 0x05, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, + 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x05, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x12, 0x33, + 0x0a, 0x07, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x19, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, + 0x6f, 0x44, 0x42, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x07, 0x6d, 0x6f, 0x6e, 0x67, + 0x6f, 0x64, 0x62, 0x12, 0x3c, 0x0a, 0x0a, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, + 0x6c, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, + 0x6f, 0x72, 0x79, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x0a, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, + 0x6c, 0x12, 0x36, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x18, 0x05, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, + 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, + 0x08, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x12, 0x33, 0x0a, 0x07, 0x68, 0x61, 0x70, + 0x72, 0x6f, 0x78, 0x79, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6e, 0x76, + 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x48, 0x41, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x07, 0x68, 0x61, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x12, 0x36, + 0x0a, 0x08, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x45, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x08, 0x65, 0x78, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x22, 0x1f, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x5d, 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x41, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x0d, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0e, + 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x22, 0x3b, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0a, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x49, 0x64, 0x22, 0xf2, 0x02, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x05, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x52, 0x05, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x22, 0xb0, 0x03, 0x0a, 0x18, 0x41, 0x64, - 0x64, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, - 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x06, 0x6e, 0x6f, - 0x64, 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x12, - 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x6f, - 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, - 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x12, - 0x5a, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, - 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, - 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x75, 0x73, 0x74, - 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, - 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x1a, 0x3f, 0x0a, 0x11, 0x43, - 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x50, 0x0a, 0x19, - 0x41, 0x64, 0x64, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x07, 0x6d, 0x6f, 0x6e, - 0x67, 0x6f, 0x64, 0x62, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6e, 0x76, - 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x07, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x22, 0xb6, - 0x03, 0x0a, 0x1b, 0x41, 0x64, 0x64, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, - 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0b, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x07, 0x6e, 0x6f, - 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, - 0x72, 0x02, 0x10, 0x01, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, - 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, - 0x63, 0x6b, 0x65, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x63, 0x6b, - 0x65, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x27, - 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, - 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x12, 0x5d, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, - 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, - 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x6f, - 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, - 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, - 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, - 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x5c, 0x0a, 0x1c, 0x41, 0x64, 0x64, 0x50, 0x6f, - 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x0a, 0x70, 0x6f, 0x73, 0x74, 0x67, - 0x72, 0x65, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, - 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, - 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x0a, 0x70, 0x6f, 0x73, 0x74, 0x67, - 0x72, 0x65, 0x73, 0x71, 0x6c, 0x22, 0xb2, 0x03, 0x0a, 0x19, 0x41, 0x64, 0x64, 0x50, 0x72, 0x6f, - 0x78, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x63, 0x65, 0x48, 0x00, 0x52, 0x05, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x12, 0x35, 0x0a, 0x07, 0x6d, + 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, + 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, + 0x64, 0x62, 0x12, 0x3e, 0x0a, 0x0a, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, + 0x72, 0x79, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x48, 0x00, 0x52, 0x0a, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, + 0x71, 0x6c, 0x12, 0x38, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, + 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x48, 0x00, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x12, 0x35, 0x0a, 0x07, + 0x68, 0x61, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, + 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x48, 0x41, 0x50, 0x72, 0x6f, 0x78, + 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x48, 0x00, 0x52, 0x07, 0x68, 0x61, 0x70, 0x72, + 0x6f, 0x78, 0x79, 0x12, 0x38, 0x0a, 0x08, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, + 0x79, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x48, 0x00, 0x52, 0x08, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x42, 0x09, 0x0a, + 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x22, 0xac, 0x03, 0x0a, 0x16, 0x41, 0x64, 0x64, + 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, @@ -2984,322 +2929,420 @@ var file_inventorypb_services_proto_rawDesc = []byte{ 0x73, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x12, 0x5b, 0x0a, 0x0d, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x12, 0x58, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x08, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, - 0x41, 0x64, 0x64, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, - 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, - 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, - 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x54, 0x0a, 0x1a, 0x41, 0x64, - 0x64, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x78, - 0x79, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6e, 0x76, - 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, - 0x22, 0xea, 0x02, 0x0a, 0x18, 0x41, 0x64, 0x64, 0x48, 0x41, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, - 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0b, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x07, 0x6e, 0x6f, 0x64, - 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, - 0x02, 0x10, 0x01, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x65, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x18, 0x0a, - 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, - 0x12, 0x5a, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, - 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, - 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x48, 0x41, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x75, 0x73, - 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, - 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x1a, 0x3f, 0x0a, 0x11, - 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x50, 0x0a, - 0x19, 0x41, 0x64, 0x64, 0x48, 0x41, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x07, 0x68, 0x61, - 0x70, 0x72, 0x6f, 0x78, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6e, - 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x48, 0x41, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x07, 0x68, 0x61, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x22, - 0x82, 0x03, 0x0a, 0x19, 0x41, 0x64, 0x64, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, - 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0b, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x07, 0x6e, 0x6f, 0x64, - 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, - 0x02, 0x10, 0x01, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x65, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x18, 0x0a, - 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, - 0x12, 0x5b, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, - 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, - 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x75, - 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x14, 0x0a, - 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x67, 0x72, - 0x6f, 0x75, 0x70, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, - 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0x54, 0x0a, 0x1a, 0x41, 0x64, 0x64, 0x45, 0x78, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x36, 0x0a, 0x08, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, - 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x52, 0x08, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x22, 0x54, 0x0a, 0x14, 0x52, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, - 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, - 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, - 0x22, 0x17, 0x0a, 0x15, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xdb, 0x01, 0x0a, 0x16, 0x41, 0x64, - 0x64, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, - 0x01, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x58, 0x0a, 0x0d, - 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, - 0x41, 0x64, 0x64, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x52, + 0x41, 0x64, 0x64, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x19, 0x0a, 0x17, 0x41, 0x64, 0x64, 0x43, 0x75, - 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x6f, 0x0a, 0x19, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x75, 0x73, 0x74, - 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x26, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x63, 0x75, 0x73, 0x74, 0x6f, - 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x0f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x4b, - 0x65, 0x79, 0x73, 0x22, 0x1c, 0x0a, 0x1a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x75, 0x73, - 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0xa1, 0x02, 0x0a, 0x14, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x65, 0x72, 0x76, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x48, 0x0a, 0x17, 0x41, 0x64, 0x64, 0x4d, 0x79, + 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4d, 0x79, + 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x05, 0x6d, 0x79, 0x73, 0x71, + 0x6c, 0x22, 0xb0, 0x03, 0x0a, 0x18, 0x41, 0x64, 0x64, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, + 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0b, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x07, 0x6e, 0x6f, + 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, + 0x72, 0x02, 0x10, 0x01, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, + 0x63, 0x6b, 0x65, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x63, 0x6b, + 0x65, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x27, + 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, + 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x12, 0x5a, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, + 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, + 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x4d, 0x6f, + 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, + 0x65, 0x6c, 0x73, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, + 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0x50, 0x0a, 0x19, 0x41, 0x64, 0x64, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, + 0x44, 0x42, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x33, 0x0a, 0x07, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4d, + 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x07, 0x6d, + 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x22, 0xb6, 0x03, 0x0a, 0x1b, 0x41, 0x64, 0x64, 0x50, 0x6f, + 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, + 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x06, 0x6e, 0x6f, + 0x64, 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x12, + 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x6f, + 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x12, + 0x5d, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, + 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, + 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, + 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x1a, 0x3f, + 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0x5c, 0x0a, 0x1c, 0x41, 0x64, 0x64, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x3c, 0x0a, 0x0a, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, + 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x52, 0x0a, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x22, 0xb2, 0x03, + 0x0a, 0x19, 0x41, 0x64, 0x64, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x0c, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, + 0x01, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, + 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x12, + 0x20, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x72, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x53, 0x65, 0x74, 0x12, 0x5b, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, + 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x69, 0x6e, + 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x72, 0x6f, 0x78, 0x79, + 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, + 0x73, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0x54, 0x0a, 0x1a, 0x41, 0x64, 0x64, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, + 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x36, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x50, + 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x08, + 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x22, 0xea, 0x02, 0x0a, 0x18, 0x41, 0x64, 0x64, + 0x48, 0x41, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, + 0x72, 0x02, 0x10, 0x01, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x20, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x06, 0x6e, 0x6f, 0x64, + 0x65, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, + 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, + 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x12, 0x5a, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, + 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x35, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x48, + 0x41, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, + 0x62, 0x65, 0x6c, 0x73, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, + 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x50, 0x0a, 0x19, 0x41, 0x64, 0x64, 0x48, 0x41, 0x50, 0x72, + 0x6f, 0x78, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x33, 0x0a, 0x07, 0x68, 0x61, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, + 0x48, 0x41, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x07, + 0x68, 0x61, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x22, 0x82, 0x03, 0x0a, 0x19, 0x41, 0x64, 0x64, 0x45, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, + 0x72, 0x02, 0x10, 0x01, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x20, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x06, 0x6e, 0x6f, 0x64, + 0x65, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, + 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, + 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x12, 0x5b, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, + 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x36, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x45, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, + 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, + 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x1a, 0x3f, 0x0a, 0x11, 0x43, + 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x54, 0x0a, 0x1a, + 0x41, 0x64, 0x64, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x08, 0x65, 0x78, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, + 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x08, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x22, 0x54, 0x0a, 0x14, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x63, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x07, 0x63, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x2c, 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x02, 0x52, 0x0e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x53, 0x65, 0x74, 0x88, 0x01, 0x01, 0x12, 0x2a, 0x0a, 0x0e, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, - 0x52, 0x0d, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x88, - 0x01, 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x42, 0x12, - 0x0a, 0x10, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, - 0x65, 0x74, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, - 0x67, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x17, 0x0a, 0x15, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2a, 0xa8, - 0x01, 0x0a, 0x0b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, - 0x0a, 0x14, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, - 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x4d, 0x59, 0x53, 0x51, - 0x4c, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x4d, - 0x4f, 0x4e, 0x47, 0x4f, 0x44, 0x42, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, 0x02, - 0x12, 0x16, 0x0a, 0x12, 0x50, 0x4f, 0x53, 0x54, 0x47, 0x52, 0x45, 0x53, 0x51, 0x4c, 0x5f, 0x53, - 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, 0x03, 0x12, 0x14, 0x0a, 0x10, 0x50, 0x52, 0x4f, 0x58, - 0x59, 0x53, 0x51, 0x4c, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, 0x04, 0x12, 0x13, - 0x0a, 0x0f, 0x48, 0x41, 0x50, 0x52, 0x4f, 0x58, 0x59, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, - 0x45, 0x10, 0x06, 0x12, 0x14, 0x0a, 0x10, 0x45, 0x58, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x5f, - 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, 0x05, 0x32, 0xaa, 0x15, 0x0a, 0x08, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0xb7, 0x01, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, - 0x6f, 0x72, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, - 0x6f, 0x72, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x66, 0x92, 0x41, 0x3d, 0x12, 0x0d, 0x4c, - 0x69, 0x73, 0x74, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x2c, 0x52, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x20, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x65, - 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, - 0x3a, 0x01, 0x2a, 0x22, 0x1b, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, - 0x72, 0x79, 0x2f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x4c, 0x69, 0x73, 0x74, - 0x12, 0xe1, 0x01, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x28, 0x2e, 0x69, 0x6e, - 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x63, 0x74, 0x69, - 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, - 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x72, 0x92, 0x41, 0x44, 0x12, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x41, 0x63, 0x74, 0x69, - 0x76, 0x65, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x20, 0x54, 0x79, 0x70, 0x65, 0x73, - 0x1a, 0x27, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x73, 0x74, - 0x20, 0x6f, 0x66, 0x20, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x3a, - 0x01, 0x2a, 0x22, 0x20, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, - 0x79, 0x2f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x4c, 0x69, 0x73, 0x74, 0x54, - 0x79, 0x70, 0x65, 0x73, 0x12, 0xa1, 0x01, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x12, 0x1c, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, - 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x47, 0x65, - 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x56, 0x92, 0x41, 0x2e, 0x12, 0x0b, 0x47, 0x65, 0x74, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x1a, 0x1f, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x61, 0x20, 0x73, 0x69, - 0x6e, 0x67, 0x6c, 0x65, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x20, 0x62, 0x79, 0x20, - 0x49, 0x44, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x3a, 0x01, 0x2a, 0x22, 0x1a, 0x2f, 0x76, - 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x73, 0x2f, 0x47, 0x65, 0x74, 0x12, 0xaf, 0x01, 0x0a, 0x0f, 0x41, 0x64, 0x64, - 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x21, 0x2e, 0x69, - 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x4d, 0x79, 0x53, 0x51, - 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x22, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x4d, - 0x79, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x55, 0x92, 0x41, 0x28, 0x12, 0x11, 0x41, 0x64, 0x64, 0x20, 0x4d, 0x79, - 0x53, 0x51, 0x4c, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x1a, 0x13, 0x41, 0x64, 0x64, - 0x73, 0x20, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x24, 0x3a, 0x01, 0x2a, 0x22, 0x1f, 0x2f, 0x76, 0x31, 0x2f, 0x69, - 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x2f, 0x41, 0x64, 0x64, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x12, 0xbb, 0x01, 0x0a, 0x11, 0x41, - 0x64, 0x64, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x12, 0x23, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, - 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, - 0x79, 0x2e, 0x41, 0x64, 0x64, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x5b, 0x92, 0x41, 0x2c, - 0x12, 0x13, 0x41, 0x64, 0x64, 0x20, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x20, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x1a, 0x15, 0x41, 0x64, 0x64, 0x73, 0x20, 0x4d, 0x6f, 0x6e, 0x67, - 0x6f, 0x44, 0x42, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x26, 0x3a, 0x01, 0x2a, 0x22, 0x21, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, - 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x41, 0x64, - 0x64, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x12, 0xcd, 0x01, 0x0a, 0x14, 0x41, 0x64, 0x64, - 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x12, 0x26, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, - 0x64, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, 0x6e, 0x76, 0x65, - 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, - 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x64, 0x92, 0x41, 0x32, 0x12, 0x16, 0x41, 0x64, 0x64, 0x20, 0x50, 0x6f, 0x73, - 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x1a, - 0x18, 0x41, 0x64, 0x64, 0x73, 0x20, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, - 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x3a, - 0x01, 0x2a, 0x22, 0x24, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, - 0x79, 0x2f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x41, 0x64, 0x64, 0x50, 0x6f, - 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x12, 0xc1, 0x01, 0x0a, 0x12, 0x41, 0x64, 0x64, - 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, - 0x24, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x50, - 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, - 0x79, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x5e, 0x92, 0x41, - 0x2e, 0x12, 0x14, 0x41, 0x64, 0x64, 0x20, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x20, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x1a, 0x16, 0x41, 0x64, 0x64, 0x73, 0x20, 0x50, 0x72, - 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x3a, 0x01, 0x2a, 0x22, 0x22, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, - 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, - 0x2f, 0x41, 0x64, 0x64, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x12, 0xc2, 0x01, 0x0a, - 0x11, 0x41, 0x64, 0x64, 0x48, 0x41, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x12, 0x23, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, - 0x64, 0x64, 0x48, 0x41, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, - 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x48, 0x41, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x62, 0x92, - 0x41, 0x2c, 0x12, 0x13, 0x41, 0x64, 0x64, 0x20, 0x48, 0x41, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x20, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x1a, 0x15, 0x41, 0x64, 0x64, 0x73, 0x20, 0x48, 0x41, - 0x50, 0x72, 0x6f, 0x78, 0x79, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x2d, 0x3a, 0x01, 0x2a, 0x22, 0x28, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, - 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, - 0x41, 0x64, 0x64, 0x48, 0x41, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x12, 0xc8, 0x01, 0x0a, 0x12, 0x41, 0x64, 0x64, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x24, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, - 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, - 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x45, 0x78, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x65, 0x92, 0x41, 0x2e, 0x12, 0x14, 0x41, 0x64, 0x64, 0x20, - 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x1a, 0x16, 0x41, 0x64, 0x64, 0x73, 0x20, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2e, 0x3a, 0x01, - 0x2a, 0x22, 0x29, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, - 0x2f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x41, 0x64, 0x64, 0x45, 0x78, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0xa1, 0x01, 0x0a, - 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1f, - 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, - 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x20, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x52, 0x65, 0x6d, 0x6f, + 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x17, 0x0a, 0x15, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x4d, 0x92, 0x41, 0x22, 0x12, 0x0e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x1a, 0x10, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x73, 0x20, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x3a, 0x01, - 0x2a, 0x22, 0x1d, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, - 0x2f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x12, 0xee, 0x01, 0x0a, 0x0f, 0x41, 0x64, 0x64, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, - 0x62, 0x65, 0x6c, 0x73, 0x12, 0x21, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, - 0x2e, 0x41, 0x64, 0x64, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, + 0x65, 0x22, 0xdb, 0x01, 0x0a, 0x16, 0x41, 0x64, 0x64, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, + 0x61, 0x62, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0a, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x49, 0x64, 0x12, 0x58, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, + 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6e, + 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x43, 0x75, 0x73, 0x74, 0x6f, + 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, + 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x1a, 0x3f, + 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0x19, 0x0a, 0x17, 0x41, 0x64, 0x64, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, + 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6f, 0x0a, 0x19, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, + 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, + 0x2a, 0x0a, 0x11, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x5f, + 0x6b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x75, 0x73, 0x74, + 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x4b, 0x65, 0x79, 0x73, 0x22, 0x1c, 0x0a, 0x1a, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xa1, 0x02, 0x0a, 0x14, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, + 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0b, 0x65, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x00, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x88, 0x01, + 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x01, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x88, 0x01, 0x01, + 0x12, 0x2c, 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x73, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x0e, 0x72, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x88, 0x01, 0x01, 0x12, 0x2a, + 0x0a, 0x0e, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x0d, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x88, 0x01, 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x65, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x65, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x17, 0x0a, + 0x15, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2a, 0xa8, 0x01, 0x0a, 0x0b, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x14, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, + 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, + 0x12, 0x11, 0x0a, 0x0d, 0x4d, 0x59, 0x53, 0x51, 0x4c, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, + 0x45, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x4d, 0x4f, 0x4e, 0x47, 0x4f, 0x44, 0x42, 0x5f, 0x53, + 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, 0x02, 0x12, 0x16, 0x0a, 0x12, 0x50, 0x4f, 0x53, 0x54, + 0x47, 0x52, 0x45, 0x53, 0x51, 0x4c, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, 0x03, + 0x12, 0x14, 0x0a, 0x10, 0x50, 0x52, 0x4f, 0x58, 0x59, 0x53, 0x51, 0x4c, 0x5f, 0x53, 0x45, 0x52, + 0x56, 0x49, 0x43, 0x45, 0x10, 0x04, 0x12, 0x13, 0x0a, 0x0f, 0x48, 0x41, 0x50, 0x52, 0x4f, 0x58, + 0x59, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, 0x06, 0x12, 0x14, 0x0a, 0x10, 0x45, + 0x58, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, + 0x05, 0x32, 0xaa, 0x15, 0x0a, 0x08, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0xb7, + 0x01, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, + 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1f, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x66, 0x92, 0x41, 0x3d, 0x12, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x1a, 0x2c, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x61, 0x20, + 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x20, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x79, 0x70, + 0x65, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x3a, 0x01, 0x2a, 0x22, 0x1b, 0x2f, 0x76, 0x31, + 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x2f, 0x4c, 0x69, 0x73, 0x74, 0x12, 0xe1, 0x01, 0x0a, 0x16, 0x4c, 0x69, 0x73, + 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, + 0x70, 0x65, 0x73, 0x12, 0x28, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, + 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x72, 0x92, 0x41, 0x44, 0x12, 0x19, 0x4c, + 0x69, 0x73, 0x74, 0x20, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x20, 0x54, 0x79, 0x70, 0x65, 0x73, 0x1a, 0x27, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x73, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x73, + 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x3a, 0x01, 0x2a, 0x22, 0x20, 0x2f, 0x76, 0x31, 0x2f, + 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x2f, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0xa1, 0x01, 0x0a, + 0x0a, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1c, 0x2e, 0x69, 0x6e, + 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6e, 0x76, 0x65, + 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x56, 0x92, 0x41, 0x2e, 0x12, 0x0b, 0x47, + 0x65, 0x74, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x1a, 0x1f, 0x52, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x73, 0x20, 0x61, 0x20, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x20, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x20, 0x62, 0x79, 0x20, 0x49, 0x44, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x1f, 0x3a, 0x01, 0x2a, 0x22, 0x1a, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, + 0x6f, 0x72, 0x79, 0x2f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x47, 0x65, 0x74, + 0x12, 0xaf, 0x01, 0x0a, 0x0f, 0x41, 0x64, 0x64, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x12, 0x21, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, + 0x2e, 0x41, 0x64, 0x64, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, - 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, - 0x65, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x93, 0x01, 0x92, 0x41, - 0x5e, 0x12, 0x19, 0x41, 0x64, 0x64, 0x2f, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x20, 0x63, - 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x1a, 0x41, 0x41, 0x64, - 0x64, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x20, 0x28, - 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6b, 0x65, 0x79, 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, - 0x73, 0x29, 0x20, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, - 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x3a, 0x01, 0x2a, 0x22, 0x27, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, - 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, - 0x2f, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x2f, 0x41, 0x64, - 0x64, 0x12, 0xdf, 0x01, 0x0a, 0x12, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x75, 0x73, 0x74, - 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x24, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, - 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, - 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, - 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, - 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x7c, 0x92, 0x41, 0x44, 0x12, 0x14, 0x52, 0x65, 0x6d, 0x6f, - 0x76, 0x65, 0x20, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, - 0x1a, 0x2c, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x73, 0x20, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, - 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x61, 0x20, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x20, 0x62, 0x79, 0x20, 0x6b, 0x65, 0x79, 0x2e, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x2f, 0x3a, 0x01, 0x2a, 0x22, 0x2a, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, - 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, - 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x2f, 0x52, 0x65, 0x6d, - 0x6f, 0x76, 0x65, 0x12, 0xd0, 0x02, 0x0a, 0x0d, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1f, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, - 0x79, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, - 0x72, 0x79, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xfb, 0x01, 0x92, 0x41, 0xcf, 0x01, 0x12, - 0x0e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x1a, - 0xbc, 0x01, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, - 0x20, 0x49, 0x66, 0x20, 0x61, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x20, 0x69, 0x73, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, - 0x66, 0x69, 0x65, 0x64, 0x2c, 0x20, 0x69, 0x74, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x73, - 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2f, 0x72, 0x65, 0x73, 0x74, - 0x6f, 0x72, 0x65, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x20, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, - 0x6c, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x6c, 0x61, - 0x74, 0x65, 0x64, 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x20, 0x46, 0x61, - 0x69, 0x6c, 0x73, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x61, 0x72, 0x65, - 0x20, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2f, - 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2e, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x22, 0x3a, 0x01, 0x2a, 0x22, 0x1d, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, - 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, - 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x42, 0x8a, 0x01, 0x0a, 0x0d, 0x63, 0x6f, 0x6d, 0x2e, 0x69, - 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x26, 0x67, 0x69, 0x74, 0x68, 0x75, - 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x65, 0x72, 0x63, 0x6f, 0x6e, 0x61, 0x2f, 0x70, 0x6d, - 0x6d, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x70, - 0x62, 0xa2, 0x02, 0x03, 0x49, 0x58, 0x58, 0xaa, 0x02, 0x09, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, - 0x6f, 0x72, 0x79, 0xca, 0x02, 0x09, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0xe2, - 0x02, 0x15, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x5c, 0x47, 0x50, 0x42, 0x4d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x09, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, - 0x6f, 0x72, 0x79, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x55, 0x92, 0x41, 0x28, + 0x12, 0x11, 0x41, 0x64, 0x64, 0x20, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x20, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x1a, 0x13, 0x41, 0x64, 0x64, 0x73, 0x20, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x20, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x24, 0x3a, 0x01, + 0x2a, 0x22, 0x1f, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, + 0x2f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x41, 0x64, 0x64, 0x4d, 0x79, 0x53, + 0x51, 0x4c, 0x12, 0xbb, 0x01, 0x0a, 0x11, 0x41, 0x64, 0x64, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, + 0x42, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x23, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, + 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, + 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x4d, 0x6f, 0x6e, + 0x67, 0x6f, 0x44, 0x42, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x5b, 0x92, 0x41, 0x2c, 0x12, 0x13, 0x41, 0x64, 0x64, 0x20, 0x4d, 0x6f, + 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x1a, 0x15, 0x41, + 0x64, 0x64, 0x73, 0x20, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x20, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x26, 0x3a, 0x01, 0x2a, 0x22, 0x21, 0x2f, + 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x41, 0x64, 0x64, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, + 0x12, 0xcd, 0x01, 0x0a, 0x14, 0x41, 0x64, 0x64, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, + 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x26, 0x2e, 0x69, 0x6e, 0x76, 0x65, + 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, + 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x27, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, + 0x64, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x64, 0x92, 0x41, 0x32, 0x12, + 0x16, 0x41, 0x64, 0x64, 0x20, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x20, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x1a, 0x18, 0x41, 0x64, 0x64, 0x73, 0x20, 0x50, 0x6f, + 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x3a, 0x01, 0x2a, 0x22, 0x24, 0x2f, 0x76, 0x31, 0x2f, + 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x2f, 0x41, 0x64, 0x64, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, + 0x12, 0xc1, 0x01, 0x0a, 0x12, 0x41, 0x64, 0x64, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x24, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, + 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, + 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x72, 0x6f, + 0x78, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x5e, 0x92, 0x41, 0x2e, 0x12, 0x14, 0x41, 0x64, 0x64, 0x20, 0x50, + 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x1a, + 0x16, 0x41, 0x64, 0x64, 0x73, 0x20, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x20, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x3a, 0x01, 0x2a, + 0x22, 0x22, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x41, 0x64, 0x64, 0x50, 0x72, 0x6f, 0x78, + 0x79, 0x53, 0x51, 0x4c, 0x12, 0xc2, 0x01, 0x0a, 0x11, 0x41, 0x64, 0x64, 0x48, 0x41, 0x50, 0x72, + 0x6f, 0x78, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x23, 0x2e, 0x69, 0x6e, 0x76, + 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x48, 0x41, 0x50, 0x72, 0x6f, 0x78, + 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x24, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x48, + 0x41, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x62, 0x92, 0x41, 0x2c, 0x12, 0x13, 0x41, 0x64, 0x64, 0x20, + 0x48, 0x41, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x1a, + 0x15, 0x41, 0x64, 0x64, 0x73, 0x20, 0x48, 0x41, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x20, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2d, 0x3a, 0x01, 0x2a, 0x22, + 0x28, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x41, 0x64, 0x64, 0x48, 0x41, 0x50, 0x72, 0x6f, + 0x78, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0xc8, 0x01, 0x0a, 0x12, 0x41, 0x64, + 0x64, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x12, 0x24, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, + 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, + 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x65, 0x92, + 0x41, 0x2e, 0x12, 0x14, 0x41, 0x64, 0x64, 0x20, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x1a, 0x16, 0x41, 0x64, 0x64, 0x73, 0x20, 0x45, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2e, 0x3a, 0x01, 0x2a, 0x22, 0x29, 0x2f, 0x76, 0x31, 0x2f, 0x69, + 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x2f, 0x41, 0x64, 0x64, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x12, 0xa1, 0x01, 0x0a, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1f, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, + 0x72, 0x79, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, + 0x6f, 0x72, 0x79, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4d, 0x92, 0x41, 0x22, 0x12, 0x0e, + 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x1a, 0x10, + 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x73, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x3a, 0x01, 0x2a, 0x22, 0x1d, 0x2f, 0x76, 0x31, 0x2f, 0x69, + 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x2f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0xee, 0x01, 0x0a, 0x0f, 0x41, 0x64, 0x64, + 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x21, 0x2e, 0x69, + 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x43, 0x75, 0x73, 0x74, + 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x22, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x43, + 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x93, 0x01, 0x92, 0x41, 0x5e, 0x12, 0x19, 0x41, 0x64, 0x64, 0x2f, 0x72, + 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x20, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x20, 0x6c, 0x61, + 0x62, 0x65, 0x6c, 0x73, 0x1a, 0x41, 0x41, 0x64, 0x64, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x72, 0x65, + 0x70, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x20, 0x28, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6b, + 0x65, 0x79, 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x29, 0x20, 0x63, 0x75, 0x73, 0x74, 0x6f, + 0x6d, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x3a, 0x01, 0x2a, + 0x22, 0x27, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, + 0x61, 0x62, 0x65, 0x6c, 0x73, 0x2f, 0x41, 0x64, 0x64, 0x12, 0xdf, 0x01, 0x0a, 0x12, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, + 0x12, 0x24, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x52, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, + 0x72, 0x79, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, + 0x61, 0x62, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x7c, 0x92, + 0x41, 0x44, 0x12, 0x14, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x63, 0x75, 0x73, 0x74, 0x6f, + 0x6d, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x1a, 0x2c, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x73, 0x20, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x20, + 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x61, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x20, 0x62, + 0x79, 0x20, 0x6b, 0x65, 0x79, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2f, 0x3a, 0x01, 0x2a, 0x22, + 0x2a, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, + 0x62, 0x65, 0x6c, 0x73, 0x2f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0xd0, 0x02, 0x0a, 0x0d, + 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1f, 0x2e, + 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, + 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0xfb, 0x01, 0x92, 0x41, 0xcf, 0x01, 0x12, 0x0e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x1a, 0xbc, 0x01, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x73, 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x20, 0x49, 0x66, 0x20, 0x61, 0x20, 0x6e, 0x65, + 0x77, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x20, + 0x69, 0x73, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x2c, 0x20, 0x69, 0x74, + 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x73, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x62, 0x61, 0x63, + 0x6b, 0x75, 0x70, 0x2f, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x61, 0x73, 0x6b, + 0x73, 0x20, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x20, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x2e, 0x20, 0x46, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x69, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x72, 0x65, 0x20, 0x61, 0x72, 0x65, 0x20, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, + 0x20, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2f, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x20, + 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x3a, 0x01, 0x2a, 0x22, + 0x1d, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x42, 0x8a, + 0x01, 0x0a, 0x0d, 0x63, 0x6f, 0x6d, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, + 0x42, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, + 0x01, 0x5a, 0x26, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x65, + 0x72, 0x63, 0x6f, 0x6e, 0x61, 0x2f, 0x70, 0x6d, 0x6d, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x69, 0x6e, + 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x70, 0x62, 0xa2, 0x02, 0x03, 0x49, 0x58, 0x58, 0xaa, + 0x02, 0x09, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0xca, 0x02, 0x09, 0x49, 0x6e, + 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0xe2, 0x02, 0x15, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, + 0x6f, 0x72, 0x79, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, + 0x02, 0x09, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, } var ( diff --git a/api/inventorypb/services.pb.validate.go b/api/inventorypb/services.pb.validate.go index 65c779fbef..9cc886143c 100644 --- a/api/inventorypb/services.pb.validate.go +++ b/api/inventorypb/services.pb.validate.go @@ -77,6 +77,8 @@ func (m *MySQLService) validate(all bool) error { // no validation rules for CustomLabels + // no validation rules for Version + if len(errors) > 0 { return MySQLServiceMultiError(errors) } @@ -196,6 +198,8 @@ func (m *MongoDBService) validate(all bool) error { // no validation rules for CustomLabels + // no validation rules for Version + if len(errors) > 0 { return MongoDBServiceMultiError(errors) } @@ -318,6 +322,8 @@ func (m *PostgreSQLService) validate(all bool) error { // no validation rules for CustomLabels + // no validation rules for Version + if len(errors) > 0 { return PostgreSQLServiceMultiError(errors) } @@ -440,6 +446,8 @@ func (m *ProxySQLService) validate(all bool) error { // no validation rules for CustomLabels + // no validation rules for Version + if len(errors) > 0 { return ProxySQLServiceMultiError(errors) } diff --git a/api/inventorypb/services.proto b/api/inventorypb/services.proto index 199f6000c6..b74b11f969 100644 --- a/api/inventorypb/services.proto +++ b/api/inventorypb/services.proto @@ -44,6 +44,8 @@ message MySQLService { string replication_set = 8; // Custom user-assigned labels. map custom_labels = 9; + // MySQL version. + string version = 11; } // MongoDBService represents a generic MongoDB instance. @@ -71,6 +73,8 @@ message MongoDBService { string replication_set = 8; // Custom user-assigned labels. map custom_labels = 9; + // MongoDB version. + string version = 11; } // PostgreSQLService represents a generic PostgreSQL instance. @@ -100,6 +104,8 @@ message PostgreSQLService { string replication_set = 8; // Custom user-assigned labels. map custom_labels = 9; + // PostgreSQL version. + string version = 12; } // ProxySQLService represents a generic ProxySQL instance. @@ -127,6 +133,8 @@ message ProxySQLService { string replication_set = 8; // Custom user-assigned labels. map custom_labels = 9; + // ProxySQL version. + string version = 11; } // HAProxyService represents a generic HAProxy service instance. diff --git a/api/managementpb/backup/json/backup.json b/api/managementpb/backup/json/backup.json index dd5fd1afe0..f2773e4ff6 100644 --- a/api/managementpb/backup/json/backup.json +++ b/api/managementpb/backup/json/backup.json @@ -680,6 +680,11 @@ "description": "Access unix socket.\nAddress (and port) or socket is required.", "type": "string", "x-order": 5 + }, + "version": { + "description": "MongoDB version.", + "type": "string", + "x-order": 10 } } }, @@ -744,6 +749,11 @@ "description": "Access unix socket.\nAddress (and port) or socket is required.", "type": "string", "x-order": 5 + }, + "version": { + "description": "MySQL version.", + "type": "string", + "x-order": 10 } } }, diff --git a/api/managementpb/backup/json/client/backups/list_artifact_compatible_services_responses.go b/api/managementpb/backup/json/client/backups/list_artifact_compatible_services_responses.go index cde43dc58d..9fcb9cb270 100644 --- a/api/managementpb/backup/json/client/backups/list_artifact_compatible_services_responses.go +++ b/api/managementpb/backup/json/client/backups/list_artifact_compatible_services_responses.go @@ -485,6 +485,9 @@ type ListArtifactCompatibleServicesOKBodyMongodbItems0 struct { // Custom user-assigned labels. CustomLabels map[string]string `json:"custom_labels,omitempty"` + + // MongoDB version. + Version string `json:"version,omitempty"` } // Validate validates this list artifact compatible services OK body mongodb items0 @@ -552,6 +555,9 @@ type ListArtifactCompatibleServicesOKBodyMysqlItems0 struct { // Custom user-assigned labels. CustomLabels map[string]string `json:"custom_labels,omitempty"` + + // MySQL version. + Version string `json:"version,omitempty"` } // Validate validates this list artifact compatible services OK body mysql items0 diff --git a/api/managementpb/json/client/mongo_db/add_mongo_db_responses.go b/api/managementpb/json/client/mongo_db/add_mongo_db_responses.go index 786557c464..451b8da408 100644 --- a/api/managementpb/json/client/mongo_db/add_mongo_db_responses.go +++ b/api/managementpb/json/client/mongo_db/add_mongo_db_responses.go @@ -1206,6 +1206,9 @@ type AddMongoDBOKBodyService struct { // Custom user-assigned labels. CustomLabels map[string]string `json:"custom_labels,omitempty"` + + // MongoDB version. + Version string `json:"version,omitempty"` } // Validate validates this add mongo DB OK body service diff --git a/api/managementpb/json/client/my_sql/add_my_sql_responses.go b/api/managementpb/json/client/my_sql/add_my_sql_responses.go index 97d0ea9998..57cc56d7f9 100644 --- a/api/managementpb/json/client/my_sql/add_my_sql_responses.go +++ b/api/managementpb/json/client/my_sql/add_my_sql_responses.go @@ -1494,6 +1494,9 @@ type AddMySQLOKBodyService struct { // Custom user-assigned labels. CustomLabels map[string]string `json:"custom_labels,omitempty"` + + // MySQL version. + Version string `json:"version,omitempty"` } // Validate validates this add my SQL OK body service diff --git a/api/managementpb/json/client/postgre_sql/add_postgre_sql_responses.go b/api/managementpb/json/client/postgre_sql/add_postgre_sql_responses.go index ba2ec37478..a4b5e93c07 100644 --- a/api/managementpb/json/client/postgre_sql/add_postgre_sql_responses.go +++ b/api/managementpb/json/client/postgre_sql/add_postgre_sql_responses.go @@ -1444,6 +1444,9 @@ type AddPostgreSQLOKBodyService struct { // Custom user-assigned labels. CustomLabels map[string]string `json:"custom_labels,omitempty"` + + // PostgreSQL version. + Version string `json:"version,omitempty"` } // Validate validates this add postgre SQL OK body service diff --git a/api/managementpb/json/client/proxy_sql/add_proxy_sql_responses.go b/api/managementpb/json/client/proxy_sql/add_proxy_sql_responses.go index f653aa22f4..bf01c16222 100644 --- a/api/managementpb/json/client/proxy_sql/add_proxy_sql_responses.go +++ b/api/managementpb/json/client/proxy_sql/add_proxy_sql_responses.go @@ -907,6 +907,9 @@ type AddProxySQLOKBodyService struct { // Custom user-assigned labels. CustomLabels map[string]string `json:"custom_labels,omitempty"` + + // ProxySQL version. + Version string `json:"version,omitempty"` } // Validate validates this add proxy SQL OK body service diff --git a/api/managementpb/json/client/rds/add_rds_responses.go b/api/managementpb/json/client/rds/add_rds_responses.go index 739b758db0..22a74012d9 100644 --- a/api/managementpb/json/client/rds/add_rds_responses.go +++ b/api/managementpb/json/client/rds/add_rds_responses.go @@ -937,6 +937,9 @@ type AddRDSOKBodyMysql struct { // Custom user-assigned labels. CustomLabels map[string]string `json:"custom_labels,omitempty"` + + // MySQL version. + Version string `json:"version,omitempty"` } // Validate validates this add RDS OK body mysql @@ -1290,6 +1293,9 @@ type AddRDSOKBodyPostgresql struct { // Custom user-assigned labels. CustomLabels map[string]string `json:"custom_labels,omitempty"` + + // PostgreSQL version. + Version string `json:"version,omitempty"` } // Validate validates this add RDS OK body postgresql diff --git a/api/managementpb/json/managementpb.json b/api/managementpb/json/managementpb.json index 57b8c1da00..5ad34a2a41 100644 --- a/api/managementpb/json/managementpb.json +++ b/api/managementpb/json/managementpb.json @@ -2833,6 +2833,11 @@ "description": "Access unix socket.\nAddress (and port) or socket is required.", "type": "string", "x-order": 5 + }, + "version": { + "description": "MongoDB version.", + "type": "string", + "x-order": 10 } }, "x-order": 0 @@ -3566,6 +3571,11 @@ "description": "Access unix socket.\nAddress (and port) or socket is required.", "type": "string", "x-order": 5 + }, + "version": { + "description": "MySQL version.", + "type": "string", + "x-order": 10 } }, "x-order": 0 @@ -4550,6 +4560,11 @@ "description": "Access unix socket.\nAddress (and port) or socket is required.", "type": "string", "x-order": 6 + }, + "version": { + "description": "PostgreSQL version.", + "type": "string", + "x-order": 11 } }, "x-order": 0 @@ -4968,6 +4983,11 @@ "description": "Access unix socket.\nAddress (and port) or socket is required.", "type": "string", "x-order": 5 + }, + "version": { + "description": "ProxySQL version.", + "type": "string", + "x-order": 10 } }, "x-order": 0 @@ -5259,6 +5279,11 @@ "description": "Access unix socket.\nAddress (and port) or socket is required.", "type": "string", "x-order": 5 + }, + "version": { + "description": "MySQL version.", + "type": "string", + "x-order": 10 } }, "x-order": 2 @@ -5499,6 +5524,11 @@ "description": "Access unix socket.\nAddress (and port) or socket is required.", "type": "string", "x-order": 6 + }, + "version": { + "description": "PostgreSQL version.", + "type": "string", + "x-order": 11 } }, "x-order": 6 diff --git a/api/managementpb/service/json/client/mgmt_service/list_services_responses.go b/api/managementpb/service/json/client/mgmt_service/list_services_responses.go index fdc3b2c330..708c684e4f 100644 --- a/api/managementpb/service/json/client/mgmt_service/list_services_responses.go +++ b/api/managementpb/service/json/client/mgmt_service/list_services_responses.go @@ -538,6 +538,9 @@ type ListServicesOKBodyServicesItems0 struct { // - UNKNOWN: The service's status cannot be known (e.g. there are no metrics yet). // Enum: [STATUS_INVALID UP DOWN UNKNOWN] Status *string `json:"status,omitempty"` + + // The service/database version. + Version string `json:"version,omitempty"` } // Validate validates this list services OK body services items0 diff --git a/api/managementpb/service/json/service.json b/api/managementpb/service/json/service.json index 56aff3ce16..7fabf9ef74 100644 --- a/api/managementpb/service/json/service.json +++ b/api/managementpb/service/json/service.json @@ -490,6 +490,11 @@ "type": "string", "format": "date-time", "x-order": 15 + }, + "version": { + "description": "The service/database version.", + "type": "string", + "x-order": 18 } } }, diff --git a/api/managementpb/service/service.pb.go b/api/managementpb/service/service.pb.go index 46248b0da4..58fa930e33 100644 --- a/api/managementpb/service/service.pb.go +++ b/api/managementpb/service/service.pb.go @@ -128,6 +128,8 @@ type UniversalService struct { Agents []*agent.UniversalAgent `protobuf:"bytes,17,rep,name=agents,proto3" json:"agents,omitempty"` // The health status of the service. Status UniversalService_Status `protobuf:"varint,18,opt,name=status,proto3,enum=service.v1beta1.UniversalService_Status" json:"status,omitempty"` + // The service/database version. + Version string `protobuf:"bytes,19,opt,name=version,proto3" json:"version,omitempty"` } func (x *UniversalService) Reset() { @@ -288,6 +290,13 @@ func (x *UniversalService) GetStatus() UniversalService_Status { return UniversalService_STATUS_INVALID } +func (x *UniversalService) GetVersion() string { + if x != nil { + return x.Version + } + return "" +} + type ListServiceRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -420,7 +429,7 @@ var file_managementpb_service_service_proto_rawDesc = []byte{ 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65, 0x6e, 0x2d, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xeb, 0x06, 0x0a, 0x10, 0x55, 0x6e, + 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x85, 0x07, 0x0a, 0x10, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x21, 0x0a, @@ -467,55 +476,56 @@ var file_managementpb_service_service_proto_rawDesc = []byte{ 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x28, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, - 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3b, 0x0a, 0x06, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x49, - 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x55, 0x50, 0x10, 0x01, - 0x12, 0x08, 0x0a, 0x04, 0x44, 0x4f, 0x57, 0x4e, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, - 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x03, 0x22, 0x8f, 0x01, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, - 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x39, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, - 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x67, - 0x72, 0x6f, 0x75, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x78, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x54, 0x0a, 0x13, 0x4c, 0x69, 0x73, - 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x3d, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x62, - 0x65, 0x74, 0x61, 0x31, 0x2e, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x32, - 0xc9, 0x01, 0x0a, 0x0b, 0x4d, 0x67, 0x6d, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, - 0xb9, 0x01, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, - 0x12, 0x23, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, - 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, - 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x5e, 0x92, 0x41, 0x35, - 0x12, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, - 0x24, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x61, 0x20, 0x66, 0x69, 0x6c, 0x74, 0x65, - 0x72, 0x65, 0x64, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x73, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x3a, 0x01, 0x2a, 0x22, 0x1b, - 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x4c, 0x69, 0x73, 0x74, 0x42, 0xc0, 0x01, 0x0a, 0x13, - 0x63, 0x6f, 0x6d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, - 0x74, 0x61, 0x31, 0x42, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x50, 0x01, 0x5a, 0x3e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x70, 0x65, 0x72, 0x63, 0x6f, 0x6e, 0x61, 0x2f, 0x70, 0x6d, 0x6d, 0x2f, 0x61, 0x70, 0x69, 0x2f, - 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2f, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x3b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x76, 0x31, 0x62, 0x65, - 0x74, 0x61, 0x31, 0xa2, 0x02, 0x03, 0x53, 0x58, 0x58, 0xaa, 0x02, 0x0f, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x2e, 0x56, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0xca, 0x02, 0x0f, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x5c, 0x56, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0xe2, 0x02, 0x1b, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5c, 0x56, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x5c, - 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x10, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x13, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, + 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3b, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, + 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, + 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x55, 0x50, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x44, 0x4f, + 0x57, 0x4e, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, + 0x03, 0x22, 0x8f, 0x01, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, + 0x64, 0x12, 0x39, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, + 0x6f, 0x72, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, + 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x25, 0x0a, 0x0e, + 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x22, 0x54, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x08, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x55, + 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, + 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x32, 0xc9, 0x01, 0x0a, 0x0b, 0x4d, 0x67, + 0x6d, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0xb9, 0x01, 0x0a, 0x0c, 0x4c, 0x69, + 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x23, 0x2e, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x24, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, + 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x5e, 0x92, 0x41, 0x35, 0x12, 0x0d, 0x4c, 0x69, 0x73, 0x74, + 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x24, 0x52, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x73, 0x20, 0x61, 0x20, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x6c, 0x69, + 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x3a, 0x01, 0x2a, 0x22, 0x1b, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, + 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x2f, 0x4c, 0x69, 0x73, 0x74, 0x42, 0xc0, 0x01, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x42, 0x0c, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3e, 0x67, + 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x65, 0x72, 0x63, 0x6f, 0x6e, + 0x61, 0x2f, 0x70, 0x6d, 0x6d, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x3b, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0xa2, 0x02, 0x03, + 0x53, 0x58, 0x58, 0xaa, 0x02, 0x0f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x56, 0x31, + 0x62, 0x65, 0x74, 0x61, 0x31, 0xca, 0x02, 0x0f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5c, + 0x56, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0xe2, 0x02, 0x1b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x5c, 0x56, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x10, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x3a, + 0x3a, 0x56, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/api/managementpb/service/service.pb.validate.go b/api/managementpb/service/service.pb.validate.go index 1591f5269c..f6ee4cd9fe 100644 --- a/api/managementpb/service/service.pb.validate.go +++ b/api/managementpb/service/service.pb.validate.go @@ -183,6 +183,8 @@ func (m *UniversalService) validate(all bool) error { // no validation rules for Status + // no validation rules for Version + if len(errors) > 0 { return UniversalServiceMultiError(errors) } diff --git a/api/managementpb/service/service.proto b/api/managementpb/service/service.proto index 218551fa62..69c71c0dcb 100644 --- a/api/managementpb/service/service.proto +++ b/api/managementpb/service/service.proto @@ -63,6 +63,8 @@ message UniversalService { repeated agent.v1beta1.UniversalAgent agents = 17; // The health status of the service. Status status = 18; + // The service/database version. + string version = 19; } message ListServiceRequest { diff --git a/api/swagger/swagger-dev.json b/api/swagger/swagger-dev.json index af4af60aaa..7d4c9028c8 100644 --- a/api/swagger/swagger-dev.json +++ b/api/swagger/swagger-dev.json @@ -15755,6 +15755,11 @@ "type": "string" }, "x-order": 9 + }, + "version": { + "description": "MongoDB version.", + "type": "string", + "x-order": 10 } }, "x-order": 0 @@ -15928,6 +15933,11 @@ "type": "string" }, "x-order": 9 + }, + "version": { + "description": "MySQL version.", + "type": "string", + "x-order": 10 } }, "x-order": 0 @@ -16106,6 +16116,11 @@ "type": "string" }, "x-order": 10 + }, + "version": { + "description": "PostgreSQL version.", + "type": "string", + "x-order": 11 } }, "x-order": 0 @@ -16279,6 +16294,11 @@ "type": "string" }, "x-order": 9 + }, + "version": { + "description": "ProxySQL version.", + "type": "string", + "x-order": 10 } }, "x-order": 0 @@ -16637,6 +16657,11 @@ "type": "string" }, "x-order": 9 + }, + "version": { + "description": "MySQL version.", + "type": "string", + "x-order": 10 } }, "x-order": 0 @@ -16698,6 +16723,11 @@ "type": "string" }, "x-order": 9 + }, + "version": { + "description": "MongoDB version.", + "type": "string", + "x-order": 10 } }, "x-order": 1 @@ -16764,6 +16794,11 @@ "type": "string" }, "x-order": 10 + }, + "version": { + "description": "PostgreSQL version.", + "type": "string", + "x-order": 11 } }, "x-order": 2 @@ -16825,6 +16860,11 @@ "type": "string" }, "x-order": 9 + }, + "version": { + "description": "ProxySQL version.", + "type": "string", + "x-order": 10 } }, "x-order": 3 @@ -17071,6 +17111,11 @@ "type": "string" }, "x-order": 9 + }, + "version": { + "description": "MySQL version.", + "type": "string", + "x-order": 10 } } }, @@ -17135,6 +17180,11 @@ "type": "string" }, "x-order": 9 + }, + "version": { + "description": "MongoDB version.", + "type": "string", + "x-order": 10 } } }, @@ -17204,6 +17254,11 @@ "type": "string" }, "x-order": 10 + }, + "version": { + "description": "PostgreSQL version.", + "type": "string", + "x-order": 11 } } }, @@ -17268,6 +17323,11 @@ "type": "string" }, "x-order": 9 + }, + "version": { + "description": "ProxySQL version.", + "type": "string", + "x-order": 10 } } }, @@ -25708,6 +25768,11 @@ "type": "string" }, "x-order": 9 + }, + "version": { + "description": "MongoDB version.", + "type": "string", + "x-order": 10 } }, "x-order": 0 @@ -26288,6 +26353,11 @@ "type": "string" }, "x-order": 9 + }, + "version": { + "description": "MySQL version.", + "type": "string", + "x-order": 10 } }, "x-order": 0 @@ -27785,6 +27855,11 @@ "type": "string" }, "x-order": 10 + }, + "version": { + "description": "PostgreSQL version.", + "type": "string", + "x-order": 11 } }, "x-order": 0 @@ -28398,6 +28473,11 @@ "type": "string" }, "x-order": 9 + }, + "version": { + "description": "ProxySQL version.", + "type": "string", + "x-order": 10 } }, "x-order": 0 @@ -28932,6 +29012,11 @@ "type": "string" }, "x-order": 9 + }, + "version": { + "description": "MySQL version.", + "type": "string", + "x-order": 10 } }, "x-order": 2 @@ -29248,6 +29333,11 @@ "type": "string" }, "x-order": 10 + }, + "version": { + "description": "PostgreSQL version.", + "type": "string", + "x-order": 11 } }, "x-order": 6 @@ -31403,6 +31493,11 @@ "UNKNOWN" ], "x-order": 17 + }, + "version": { + "description": "The service/database version.", + "type": "string", + "x-order": 18 } } }, @@ -33252,6 +33347,11 @@ "type": "string" }, "x-order": 9 + }, + "version": { + "description": "MySQL version.", + "type": "string", + "x-order": 10 } } }, @@ -33316,6 +33416,11 @@ "type": "string" }, "x-order": 9 + }, + "version": { + "description": "MongoDB version.", + "type": "string", + "x-order": 10 } } }, diff --git a/api/swagger/swagger.json b/api/swagger/swagger.json index 13fd52ea88..ac0d245d84 100644 --- a/api/swagger/swagger.json +++ b/api/swagger/swagger.json @@ -12911,6 +12911,11 @@ "type": "string" }, "x-order": 9 + }, + "version": { + "description": "MongoDB version.", + "type": "string", + "x-order": 10 } }, "x-order": 0 @@ -13084,6 +13089,11 @@ "type": "string" }, "x-order": 9 + }, + "version": { + "description": "MySQL version.", + "type": "string", + "x-order": 10 } }, "x-order": 0 @@ -13262,6 +13272,11 @@ "type": "string" }, "x-order": 10 + }, + "version": { + "description": "PostgreSQL version.", + "type": "string", + "x-order": 11 } }, "x-order": 0 @@ -13435,6 +13450,11 @@ "type": "string" }, "x-order": 9 + }, + "version": { + "description": "ProxySQL version.", + "type": "string", + "x-order": 10 } }, "x-order": 0 @@ -13793,6 +13813,11 @@ "type": "string" }, "x-order": 9 + }, + "version": { + "description": "MySQL version.", + "type": "string", + "x-order": 10 } }, "x-order": 0 @@ -13854,6 +13879,11 @@ "type": "string" }, "x-order": 9 + }, + "version": { + "description": "MongoDB version.", + "type": "string", + "x-order": 10 } }, "x-order": 1 @@ -13920,6 +13950,11 @@ "type": "string" }, "x-order": 10 + }, + "version": { + "description": "PostgreSQL version.", + "type": "string", + "x-order": 11 } }, "x-order": 2 @@ -13981,6 +14016,11 @@ "type": "string" }, "x-order": 9 + }, + "version": { + "description": "ProxySQL version.", + "type": "string", + "x-order": 10 } }, "x-order": 3 @@ -14227,6 +14267,11 @@ "type": "string" }, "x-order": 9 + }, + "version": { + "description": "MySQL version.", + "type": "string", + "x-order": 10 } } }, @@ -14291,6 +14336,11 @@ "type": "string" }, "x-order": 9 + }, + "version": { + "description": "MongoDB version.", + "type": "string", + "x-order": 10 } } }, @@ -14360,6 +14410,11 @@ "type": "string" }, "x-order": 10 + }, + "version": { + "description": "PostgreSQL version.", + "type": "string", + "x-order": 11 } } }, @@ -14424,6 +14479,11 @@ "type": "string" }, "x-order": 9 + }, + "version": { + "description": "ProxySQL version.", + "type": "string", + "x-order": 10 } } }, @@ -17323,6 +17383,11 @@ "type": "string" }, "x-order": 9 + }, + "version": { + "description": "MongoDB version.", + "type": "string", + "x-order": 10 } }, "x-order": 0 @@ -17903,6 +17968,11 @@ "type": "string" }, "x-order": 9 + }, + "version": { + "description": "MySQL version.", + "type": "string", + "x-order": 10 } }, "x-order": 0 @@ -18954,6 +19024,11 @@ "type": "string" }, "x-order": 10 + }, + "version": { + "description": "PostgreSQL version.", + "type": "string", + "x-order": 11 } }, "x-order": 0 @@ -19567,6 +19642,11 @@ "type": "string" }, "x-order": 9 + }, + "version": { + "description": "ProxySQL version.", + "type": "string", + "x-order": 10 } }, "x-order": 0 @@ -20101,6 +20181,11 @@ "type": "string" }, "x-order": 9 + }, + "version": { + "description": "MySQL version.", + "type": "string", + "x-order": 10 } }, "x-order": 2 @@ -20417,6 +20502,11 @@ "type": "string" }, "x-order": 10 + }, + "version": { + "description": "PostgreSQL version.", + "type": "string", + "x-order": 11 } }, "x-order": 6 @@ -23000,6 +23090,11 @@ "type": "string" }, "x-order": 9 + }, + "version": { + "description": "MySQL version.", + "type": "string", + "x-order": 10 } } }, @@ -23064,6 +23159,11 @@ "type": "string" }, "x-order": 9 + }, + "version": { + "description": "MongoDB version.", + "type": "string", + "x-order": 10 } } }, diff --git a/managed/cmd/pmm-managed/main.go b/managed/cmd/pmm-managed/main.go index cd203b2e31..0019765566 100644 --- a/managed/cmd/pmm-managed/main.go +++ b/managed/cmd/pmm-managed/main.go @@ -193,6 +193,7 @@ type gRPCServerDeps struct { actions *agents.ActionsService agentsStateUpdater *agents.StateUpdater connectionCheck *agents.ConnectionChecker + serviceInfoBroker *agents.ServiceInfoBroker grafanaClient *grafana.Client checksService *checks.Service dbaasClient *dbaas.Client @@ -259,7 +260,7 @@ func runGRPCServer(ctx context.Context, deps *gRPCServerDeps) { servicesSvc := inventory.NewServicesService(deps.db, deps.agentsRegistry, deps.agentsStateUpdater, deps.vmdb, deps.versionCache) agentsSvc := inventory.NewAgentsService( deps.db, deps.agentsRegistry, deps.agentsStateUpdater, - deps.vmdb, deps.connectionCheck, deps.agentService) + deps.vmdb, deps.connectionCheck, deps.serviceInfoBroker, deps.agentService) mgmtBackupsService := managementbackup.NewBackupsService(deps.db, deps.backupService, deps.compatibilityService, deps.schedulerService) mgmtArtifactsService := managementbackup.NewArtifactsService(deps.db, deps.backupRemovalService, deps.pbmPITRService) @@ -273,10 +274,10 @@ func runGRPCServer(ctx context.Context, deps *gRPCServerDeps) { nodeSvc := management.NewNodeService(deps.db, deps.grafanaClient) agentSvc := management.NewAgentService(deps.db, deps.agentsRegistry) serviceSvc := management.NewServiceService(deps.db, deps.agentsRegistry, deps.agentsStateUpdater, deps.vmdb) - mysqlSvc := management.NewMySQLService(deps.db, deps.agentsStateUpdater, deps.connectionCheck, deps.versionCache) - mongodbSvc := management.NewMongoDBService(deps.db, deps.agentsStateUpdater, deps.connectionCheck, deps.versionCache) - postgresqlSvc := management.NewPostgreSQLService(deps.db, deps.agentsStateUpdater, deps.connectionCheck) - proxysqlSvc := management.NewProxySQLService(deps.db, deps.agentsStateUpdater, deps.connectionCheck) + mysqlSvc := management.NewMySQLService(deps.db, deps.agentsStateUpdater, deps.connectionCheck, deps.serviceInfoBroker, deps.versionCache) + mongodbSvc := management.NewMongoDBService(deps.db, deps.agentsStateUpdater, deps.connectionCheck, deps.serviceInfoBroker, deps.versionCache) + postgresqlSvc := management.NewPostgreSQLService(deps.db, deps.agentsStateUpdater, deps.connectionCheck, deps.serviceInfoBroker) + proxysqlSvc := management.NewProxySQLService(deps.db, deps.agentsStateUpdater, deps.connectionCheck, deps.serviceInfoBroker) managementpb.RegisterNodeServer(gRPCServer, managementgrpc.NewManagementNodeServer(nodeSvc)) agentv1beta1.RegisterAgentServer(gRPCServer, agentSvc) diff --git a/managed/models/database.go b/managed/models/database.go index f1291d50b0..9aeda6c39a 100644 --- a/managed/models/database.go +++ b/managed/models/database.go @@ -918,13 +918,17 @@ var databaseSchema = [][]string{ 85: { `UPDATE services SET cluster = service_name WHERE cluster = ''`, }, + 86: { + `ALTER TABLE services + ADD COLUMN version VARCHAR NOT NULL DEFAULT ''`, + }, } // ^^^ Avoid default values in schema definition. ^^^ // aleksi: Go's zero values and non-zero default values in database do play nicely together in INSERTs and UPDATEs. // OpenDB returns configured connection pool for PostgreSQL. -// OpenDB just validate its arguments without creating a connection to the database. +// OpenDB just validates its arguments without creating a connection to the database. func OpenDB(params SetupDBParams) (*sql.DB, error) { q := make(url.Values) if params.SSLMode == "" { diff --git a/managed/models/service_model.go b/managed/models/service_model.go index c022296c1f..2026489eec 100644 --- a/managed/models/service_model.go +++ b/managed/models/service_model.go @@ -58,6 +58,7 @@ type Service struct { ReplicationSet string `reform:"replication_set"` CustomLabels []byte `reform:"custom_labels"` ExternalGroup string `reform:"external_group"` + Version string `reform:"version"` CreatedAt time.Time `reform:"created_at"` UpdatedAt time.Time `reform:"updated_at"` diff --git a/managed/models/service_model_reform.go b/managed/models/service_model_reform.go index 51d2869b47..b3ce66fab6 100644 --- a/managed/models/service_model_reform.go +++ b/managed/models/service_model_reform.go @@ -38,6 +38,7 @@ func (v *serviceTableType) Columns() []string { "replication_set", "custom_labels", "external_group", + "version", "created_at", "updated_at", "address", @@ -77,6 +78,7 @@ var ServiceTable = &serviceTableType{ {Name: "ReplicationSet", Type: "string", Column: "replication_set"}, {Name: "CustomLabels", Type: "[]uint8", Column: "custom_labels"}, {Name: "ExternalGroup", Type: "string", Column: "external_group"}, + {Name: "Version", Type: "string", Column: "version"}, {Name: "CreatedAt", Type: "time.Time", Column: "created_at"}, {Name: "UpdatedAt", Type: "time.Time", Column: "updated_at"}, {Name: "Address", Type: "*string", Column: "address"}, @@ -90,7 +92,7 @@ var ServiceTable = &serviceTableType{ // String returns a string representation of this struct or record. func (s Service) String() string { - res := make([]string, 15) + res := make([]string, 16) res[0] = "ServiceID: " + reform.Inspect(s.ServiceID, true) res[1] = "ServiceType: " + reform.Inspect(s.ServiceType, true) res[2] = "ServiceName: " + reform.Inspect(s.ServiceName, true) @@ -101,11 +103,12 @@ func (s Service) String() string { res[7] = "ReplicationSet: " + reform.Inspect(s.ReplicationSet, true) res[8] = "CustomLabels: " + reform.Inspect(s.CustomLabels, true) res[9] = "ExternalGroup: " + reform.Inspect(s.ExternalGroup, true) - res[10] = "CreatedAt: " + reform.Inspect(s.CreatedAt, true) - res[11] = "UpdatedAt: " + reform.Inspect(s.UpdatedAt, true) - res[12] = "Address: " + reform.Inspect(s.Address, true) - res[13] = "Port: " + reform.Inspect(s.Port, true) - res[14] = "Socket: " + reform.Inspect(s.Socket, true) + res[10] = "Version: " + reform.Inspect(s.Version, true) + res[11] = "CreatedAt: " + reform.Inspect(s.CreatedAt, true) + res[12] = "UpdatedAt: " + reform.Inspect(s.UpdatedAt, true) + res[13] = "Address: " + reform.Inspect(s.Address, true) + res[14] = "Port: " + reform.Inspect(s.Port, true) + res[15] = "Socket: " + reform.Inspect(s.Socket, true) return strings.Join(res, ", ") } @@ -123,6 +126,7 @@ func (s *Service) Values() []interface{} { s.ReplicationSet, s.CustomLabels, s.ExternalGroup, + s.Version, s.CreatedAt, s.UpdatedAt, s.Address, @@ -145,6 +149,7 @@ func (s *Service) Pointers() []interface{} { &s.ReplicationSet, &s.CustomLabels, &s.ExternalGroup, + &s.Version, &s.CreatedAt, &s.UpdatedAt, &s.Address, diff --git a/managed/services/agents/channel/channel.go b/managed/services/agents/channel/channel.go index dfbb859174..5eec34e666 100644 --- a/managed/services/agents/channel/channel.go +++ b/managed/services/agents/channel/channel.go @@ -285,6 +285,8 @@ func (c *Channel) runReceiver() { c.publish(msg.Id, msg.Status, p.PbmSwitchPitr) case *agentpb.AgentMessage_AgentLogs: c.publish(msg.Id, msg.Status, p.AgentLogs) + case *agentpb.AgentMessage_ServiceInfo: + c.publish(msg.Id, msg.Status, p.ServiceInfo) case nil: c.cancel(msg.Id, errors.Errorf("unimplemented: failed to handle received message %s", msg)) diff --git a/managed/services/agents/connection_checker.go b/managed/services/agents/connection_checker.go index b784fd4d85..f53c8c686f 100644 --- a/managed/services/agents/connection_checker.go +++ b/managed/services/agents/connection_checker.go @@ -49,7 +49,7 @@ func NewConnectionChecker(r *Registry) *ConnectionChecker { } } -// CheckConnectionToService sends request to pmm-agent to check connection to service. +// CheckConnectionToService sends a request to pmm-agent to check connection to service. func (c *ConnectionChecker) CheckConnectionToService(ctx context.Context, q *reform.Querier, service *models.Service, agent *models.Agent) error { l := logger.Get(ctx) start := time.Now() @@ -59,6 +59,17 @@ func (c *ConnectionChecker) CheckConnectionToService(ctx context.Context, q *ref } }() + switch service.ServiceType { + case models.MySQLServiceType, + models.ExternalServiceType, + models.HAProxyServiceType, + models.PostgreSQLServiceType, + models.MongoDBServiceType, + models.ProxySQLServiceType: + default: + return errors.Errorf("unhandled Service type %s", service.ServiceType) + } + pmmAgentID := pointer.GetString(agent.PMMAgentID) if !agent.PushMetrics && (service.ServiceType == models.ExternalServiceType || service.ServiceType == models.HAProxyServiceType) { pmmAgentID = models.PMMServerAgentID @@ -81,7 +92,7 @@ func (c *ConnectionChecker) CheckConnectionToService(ctx context.Context, q *ref return err } - request, err := connectionRequest(q, service, agent) + request, err := createConnectionRequest(q, service, agent) if err != nil { return err } @@ -91,30 +102,13 @@ func (c *ConnectionChecker) CheckConnectionToService(ctx context.Context, q *ref sanitizedDSN = strings.ReplaceAll(request.Dsn, word, "****") } l.Infof("CheckConnectionRequest: type: %s, DSN: %s timeout: %s.", request.Type, sanitizedDSN, request.Timeout) + resp, err := pmmAgent.channel.SendAndWaitResponse(request) if err != nil { return err } l.Infof("CheckConnection response: %+v.", resp) - switch service.ServiceType { - case models.MySQLServiceType: - tableCount := resp.(*agentpb.CheckConnectionResponse).GetStats().GetTableCount() //nolint:forcetypeassert - agent.TableCount = &tableCount - l.Debugf("Updating table count: %d.", tableCount) - if err = q.Update(agent); err != nil { - return errors.Wrap(err, "failed to update table count") - } - case models.ExternalServiceType, models.HAProxyServiceType: - case models.PostgreSQLServiceType: - case models.MongoDBServiceType: - case models.ProxySQLServiceType: - // nothing yet - - default: - return errors.Errorf("unhandled Service type %s", service.ServiceType) - } - msg := resp.(*agentpb.CheckConnectionResponse).Error //nolint:forcetypeassert switch msg { case "": @@ -125,7 +119,7 @@ func (c *ConnectionChecker) CheckConnectionToService(ctx context.Context, q *ref return status.Error(codes.FailedPrecondition, fmt.Sprintf("Connection check failed: %s.", msg)) } -func connectionRequest(q *reform.Querier, service *models.Service, agent *models.Agent) (*agentpb.CheckConnectionRequest, error) { +func createConnectionRequest(q *reform.Querier, service *models.Service, agent *models.Agent) (*agentpb.CheckConnectionRequest, error) { var request *agentpb.CheckConnectionRequest switch service.ServiceType { case models.MySQLServiceType: diff --git a/managed/services/agents/service_info_broker.go b/managed/services/agents/service_info_broker.go new file mode 100644 index 0000000000..3513dcb0af --- /dev/null +++ b/managed/services/agents/service_info_broker.go @@ -0,0 +1,207 @@ +// Copyright (C) 2017 Percona LLC +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package agents + +import ( + "context" + "fmt" + "strings" + "time" + + "github.com/AlekSi/pointer" + "github.com/pkg/errors" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/types/known/durationpb" + "gopkg.in/reform.v1" + + "github.com/percona/pmm/api/agentpb" + "github.com/percona/pmm/api/inventorypb" + "github.com/percona/pmm/managed/models" + "github.com/percona/pmm/utils/logger" +) + +// ServiceInfoBroker checks if connection can be established to service. +type ServiceInfoBroker struct { + r *Registry +} + +// NewServiceInfoBroker creates new connection checker. +func NewServiceInfoBroker(r *Registry) *ServiceInfoBroker { + return &ServiceInfoBroker{ + r: r, + } +} + +func createServiceInfoRequest(q *reform.Querier, service *models.Service, agent *models.Agent) (*agentpb.ServiceInfoRequest, error) { + var request *agentpb.ServiceInfoRequest + switch service.ServiceType { + case models.MySQLServiceType: + tdp := agent.TemplateDelimiters(service) + request = &agentpb.ServiceInfoRequest{ + Type: inventorypb.ServiceType_MYSQL_SERVICE, + Dsn: agent.DSN(service, 2*time.Second, service.DatabaseName, nil), + Timeout: durationpb.New(3 * time.Second), + TextFiles: &agentpb.TextFiles{ + Files: agent.Files(), + TemplateLeftDelim: tdp.Left, + TemplateRightDelim: tdp.Right, + }, + TlsSkipVerify: agent.TLSSkipVerify, + } + case models.PostgreSQLServiceType: + tdp := agent.TemplateDelimiters(service) + request = &agentpb.ServiceInfoRequest{ + Type: inventorypb.ServiceType_POSTGRESQL_SERVICE, + Dsn: agent.DSN(service, 2*time.Second, service.DatabaseName, nil), + Timeout: durationpb.New(3 * time.Second), + TextFiles: &agentpb.TextFiles{ + Files: agent.Files(), + TemplateLeftDelim: tdp.Left, + TemplateRightDelim: tdp.Right, + }, + } + case models.MongoDBServiceType: + tdp := agent.TemplateDelimiters(service) + request = &agentpb.ServiceInfoRequest{ + Type: inventorypb.ServiceType_MONGODB_SERVICE, + Dsn: agent.DSN(service, 2*time.Second, service.DatabaseName, nil), + Timeout: durationpb.New(3 * time.Second), + TextFiles: &agentpb.TextFiles{ + Files: agent.Files(), + TemplateLeftDelim: tdp.Left, + TemplateRightDelim: tdp.Right, + }, + } + case models.ProxySQLServiceType: + request = &agentpb.ServiceInfoRequest{ + Type: inventorypb.ServiceType_PROXYSQL_SERVICE, + Dsn: agent.DSN(service, 2*time.Second, service.DatabaseName, nil), + Timeout: durationpb.New(3 * time.Second), + } + case models.ExternalServiceType: + exporterURL, err := agent.ExporterURL(q) + if err != nil { + return nil, err + } + + request = &agentpb.ServiceInfoRequest{ + Type: inventorypb.ServiceType_EXTERNAL_SERVICE, + Dsn: exporterURL, + Timeout: durationpb.New(3 * time.Second), + } + case models.HAProxyServiceType: + exporterURL, err := agent.ExporterURL(q) + if err != nil { + return nil, err + } + + request = &agentpb.ServiceInfoRequest{ + Type: inventorypb.ServiceType_HAPROXY_SERVICE, + Dsn: exporterURL, + Timeout: durationpb.New(3 * time.Second), + } + default: + return nil, errors.Errorf("unhandled Service type %s", service.ServiceType) + } + return request, nil +} + +// GetInfoFromService sends a request to pmm-agent to query information from a service. +func (c *ServiceInfoBroker) GetInfoFromService(ctx context.Context, q *reform.Querier, service *models.Service, agent *models.Agent) error { + l := logger.Get(ctx) + start := time.Now() + defer func() { + if dur := time.Since(start); dur > 4*time.Second { + l.Warnf("GetInfoFromService took %s.", dur) + } + }() + + // External exporters and haproxy do not support this functionality. + if service.ServiceType == models.ExternalServiceType || service.ServiceType == models.HAProxyServiceType { + return nil + } + + pmmAgentID := pointer.GetString(agent.PMMAgentID) + if !agent.PushMetrics && (service.ServiceType == models.ExternalServiceType || service.ServiceType == models.HAProxyServiceType) { + pmmAgentID = models.PMMServerAgentID + } + + pmmAgent, err := c.r.get(pmmAgentID) + if err != nil { + return err + } + + request, err := createServiceInfoRequest(q, service, agent) + if err != nil { + return err + } + + var sanitizedDSN string + for _, word := range redactWords(agent) { + sanitizedDSN = strings.ReplaceAll(request.Dsn, word, "****") + } + l.Infof("ServiceInfoRequest: type: %s, DSN: %s timeout: %s.", request.Type, sanitizedDSN, request.Timeout) + resp, err := pmmAgent.channel.SendAndWaitResponse(request) + if err != nil { + return err + } + l.Infof("ServiceInfo response: %+v.", resp) + + stype := service.ServiceType + switch stype { + case models.MySQLServiceType: + stats := resp.(*agentpb.ServiceInfoResponse) //nolint:forcetypeassert + tableCount := stats.GetTableCount() + agent.TableCount = &tableCount + l.Debugf("Updating table count: %d.", tableCount) + if err = q.Update(agent); err != nil { + return errors.Wrap(err, "failed to update table count") + } + return updateServiceVersion(ctx, q, resp, service) + case models.ExternalServiceType, models.HAProxyServiceType: + case models.PostgreSQLServiceType: + return updateServiceVersion(ctx, q, resp, service) + case models.MongoDBServiceType: + return updateServiceVersion(ctx, q, resp, service) + case models.ProxySQLServiceType: + return updateServiceVersion(ctx, q, resp, service) + default: + return errors.Errorf("unhandled Service type %s", service.ServiceType) + } + + msg := resp.(*agentpb.ServiceInfoResponse).Error //nolint:forcetypeassert + switch msg { + case "": + return nil + case context.Canceled.Error(), context.DeadlineExceeded.Error(): + msg = fmt.Sprintf("timeout (%s)", msg) + } + return status.Error(codes.FailedPrecondition, fmt.Sprintf("Connection check failed: %s.", msg)) +} + +func updateServiceVersion(ctx context.Context, q *reform.Querier, resp agentpb.AgentResponsePayload, service *models.Service) error { + l := logger.Get(ctx) + + version := resp.(*agentpb.ServiceInfoResponse).GetVersion() //nolint:forcetypeassert + service.Version = version + l.Debugf("Updating service version: %s.", version) + if err := q.Update(service); err != nil { + return errors.Wrap(err, "failed to update service version") + } + + return nil +} diff --git a/managed/services/backup/pitr_timerange_service.go b/managed/services/backup/pitr_timerange_service.go index 8f691a7777..ee604003ff 100644 --- a/managed/services/backup/pitr_timerange_service.go +++ b/managed/services/backup/pitr_timerange_service.go @@ -251,7 +251,7 @@ func getTimelines(slices []*oplogChunk) []Timeline { var timelines []Timeline var prevEnd primitive.Timestamp for _, s := range slices { - if prevEnd.T != 0 && primitive.CompareTimestamp(prevEnd, s.StartTS) == -1 { + if prevEnd.T != 0 && prevEnd.Compare(s.StartTS) == -1 { timelines = append(timelines, tl) tl = Timeline{} } diff --git a/managed/services/inventory/agents.go b/managed/services/inventory/agents.go index 6e35a6c371..cfb064cdfd 100644 --- a/managed/services/inventory/agents.go +++ b/managed/services/inventory/agents.go @@ -38,10 +38,11 @@ type AgentsService struct { vmdb prometheusService db *reform.DB cc connectionChecker + sib serviceInfoBroker } // NewAgentsService creates new AgentsService. -func NewAgentsService(db *reform.DB, r agentsRegistry, state agentsStateUpdater, vmdb prometheusService, cc connectionChecker, a agentService) *AgentsService { +func NewAgentsService(db *reform.DB, r agentsRegistry, state agentsStateUpdater, vmdb prometheusService, cc connectionChecker, sib serviceInfoBroker, a agentService) *AgentsService { //nolint:lll return &AgentsService{ r: r, a: a, @@ -49,6 +50,7 @@ func NewAgentsService(db *reform.DB, r agentsRegistry, state agentsStateUpdater, vmdb: vmdb, db: db, cc: cc, + sib: sib, } } @@ -259,17 +261,22 @@ func (as *AgentsService) AddMySQLdExporter(ctx context.Context, req *inventorypb if err != nil { return err } - if !req.SkipConnectionCheck { - service, err := models.FindServiceByID(tx.Querier, req.ServiceId) - if err != nil { - return err - } + service, err := models.FindServiceByID(tx.Querier, req.ServiceId) + if err != nil { + return err + } + + if !req.SkipConnectionCheck { if err = as.cc.CheckConnectionToService(ctx, tx.Querier, service, row); err != nil { return err } } + if err = as.sib.GetInfoFromService(ctx, tx.Querier, service, row); err != nil { + return err + } + agent, err := services.ToAPIAgent(tx.Querier, row) if err != nil { return err @@ -319,17 +326,22 @@ func (as *AgentsService) AddMongoDBExporter(ctx context.Context, req *inventoryp if err != nil { return err } - if !req.SkipConnectionCheck { - service, err := models.FindServiceByID(tx.Querier, req.ServiceId) - if err != nil { - return err - } + service, err := models.FindServiceByID(tx.Querier, req.ServiceId) + if err != nil { + return err + } + + if !req.SkipConnectionCheck { if err = as.cc.CheckConnectionToService(ctx, tx.Querier, service, row); err != nil { return err } } + if err = as.sib.GetInfoFromService(ctx, tx.Querier, service, row); err != nil { + return err + } + agent, err := services.ToAPIAgent(tx.Querier, row) if err != nil { return err @@ -508,17 +520,22 @@ func (as *AgentsService) AddPostgresExporter(ctx context.Context, req *inventory if err != nil { return err } - if !req.SkipConnectionCheck { - service, err := models.FindServiceByID(tx.Querier, req.ServiceId) - if err != nil { - return err - } + service, err := models.FindServiceByID(tx.Querier, req.ServiceId) + if err != nil { + return err + } + + if !req.SkipConnectionCheck { if err = as.cc.CheckConnectionToService(ctx, tx.Querier, service, row); err != nil { return err } } + if err = as.sib.GetInfoFromService(ctx, tx.Querier, service, row); err != nil { + return err + } + agent, err := services.ToAPIAgent(tx.Querier, row) if err != nil { return err @@ -631,17 +648,22 @@ func (as *AgentsService) AddProxySQLExporter(ctx context.Context, req *inventory if err != nil { return err } - if !req.SkipConnectionCheck { - service, err := models.FindServiceByID(tx.Querier, req.ServiceId) - if err != nil { - return err - } + service, err := models.FindServiceByID(tx.Querier, req.ServiceId) + if err != nil { + return err + } + + if !req.SkipConnectionCheck { if err = as.cc.CheckConnectionToService(ctx, tx.Querier, service, row); err != nil { return err } } + if err = as.sib.GetInfoFromService(ctx, tx.Querier, service, row); err != nil { + return err + } + agent, err := services.ToAPIAgent(tx.Querier, row) if err != nil { return err diff --git a/managed/services/inventory/deps.go b/managed/services/inventory/deps.go index a1471ea79c..4eaa70fff2 100644 --- a/managed/services/inventory/deps.go +++ b/managed/services/inventory/deps.go @@ -28,6 +28,7 @@ import ( //go:generate ../../../bin/mockery --name=agentsStateUpdater --case=snake --inpackage --testonly //go:generate ../../../bin/mockery --name=prometheusService --case=snake --inpackage --testonly //go:generate ../../../bin/mockery --name=connectionChecker --case=snake --inpackage --testonly +//go:generate ../../../bin/mockery --name=serviceInfoBroker --case=snake --inpackage --testonly //go:generate ../../../bin/mockery --name=versionCache --case=snake --inpackage --testonly //go:generate ../../../bin/mockery --name=inventoryMetrics --case=snake --inpackage --testonly @@ -64,6 +65,11 @@ type connectionChecker interface { CheckConnectionToService(ctx context.Context, q *reform.Querier, service *models.Service, agent *models.Agent) error } +// serviceInfoBroker is a subset of methods of serviceinfobroker.ServiceInfoBroker used by this package. +type serviceInfoBroker interface { + GetInfoFromService(ctx context.Context, q *reform.Querier, service *models.Service, agent *models.Agent) error +} + // versionCache is a subset of methods of versioncache.Service used by this package. // We use it instead of real type for testing and to avoid dependency cycle. type versionCache interface { diff --git a/managed/services/inventory/mock_service_info_broker_test.go b/managed/services/inventory/mock_service_info_broker_test.go new file mode 100644 index 0000000000..6cc2d01178 --- /dev/null +++ b/managed/services/inventory/mock_service_info_broker_test.go @@ -0,0 +1,46 @@ +// Code generated by mockery v2.33.0. DO NOT EDIT. + +package inventory + +import ( + context "context" + + mock "github.com/stretchr/testify/mock" + reform "gopkg.in/reform.v1" + + models "github.com/percona/pmm/managed/models" +) + +// mockServiceInfoBroker is an autogenerated mock type for the serviceInfoBroker type +type mockServiceInfoBroker struct { + mock.Mock +} + +// GetInfoFromService provides a mock function with given fields: ctx, q, service, agent +func (_m *mockServiceInfoBroker) GetInfoFromService(ctx context.Context, q *reform.Querier, service *models.Service, agent *models.Agent) error { + ret := _m.Called(ctx, q, service, agent) + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, *reform.Querier, *models.Service, *models.Agent) error); ok { + r0 = rf(ctx, q, service, agent) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// newMockServiceInfoBroker creates a new instance of mockServiceInfoBroker. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockServiceInfoBroker(t interface { + mock.TestingT + Cleanup(func()) +}, +) *mockServiceInfoBroker { + mock := &mockServiceInfoBroker{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/managed/services/inventory/services_test.go b/managed/services/inventory/services_test.go index c908cbb333..d5a39b4dda 100644 --- a/managed/services/inventory/services_test.go +++ b/managed/services/inventory/services_test.go @@ -64,6 +64,9 @@ func setup(t *testing.T) (*ServicesService, *AgentsService, *NodesService, func( as := &mockAgentService{} as.Test(t) + sib := &mockServiceInfoBroker{} + sib.Test(t) + teardown := func(t *testing.T) { t.Helper() uuid.SetRand(nil) @@ -77,7 +80,7 @@ func setup(t *testing.T) (*ServicesService, *AgentsService, *NodesService, func( } return NewServicesService(db, r, state, vmdb, vc), - NewAgentsService(db, r, state, vmdb, cc, as), + NewAgentsService(db, r, state, vmdb, cc, sib, as), NewNodesService(db, r, state, vmdb), teardown, logger.Set(context.Background(), t.Name()), diff --git a/managed/services/management/deps.go b/managed/services/management/deps.go index b87ae574e3..291e71bdad 100644 --- a/managed/services/management/deps.go +++ b/managed/services/management/deps.go @@ -91,6 +91,11 @@ type connectionChecker interface { CheckConnectionToService(ctx context.Context, q *reform.Querier, service *models.Service, agent *models.Agent) error } +// serviceInfoBroker is a subset of methods of serviceinfobroker.ServiceInfoBroker used by this package. +type serviceInfoBroker interface { + GetInfoFromService(ctx context.Context, q *reform.Querier, service *models.Service, agent *models.Agent) error +} + // versionCache is a subset of methods of versioncache.Service used by this package. // We use it instead of real type for testing and to avoid dependency cycle. type versionCache interface { diff --git a/managed/services/management/mongodb.go b/managed/services/management/mongodb.go index de7d063415..3aa0f7b465 100644 --- a/managed/services/management/mongodb.go +++ b/managed/services/management/mongodb.go @@ -32,15 +32,17 @@ type MongoDBService struct { db *reform.DB state agentsStateUpdater cc connectionChecker + sib serviceInfoBroker vc versionCache } // NewMongoDBService creates new MongoDB Management Service. -func NewMongoDBService(db *reform.DB, state agentsStateUpdater, cc connectionChecker, vc versionCache) *MongoDBService { +func NewMongoDBService(db *reform.DB, state agentsStateUpdater, cc connectionChecker, sib serviceInfoBroker, vc versionCache) *MongoDBService { return &MongoDBService{ db: db, state: state, cc: cc, + sib: sib, vc: vc, } } @@ -105,6 +107,10 @@ func (s *MongoDBService) Add(ctx context.Context, req *managementpb.AddMongoDBRe } } + if err = s.sib.GetInfoFromService(ctx, tx.Querier, service, row); err != nil { + return err + } + agent, err := services.ToAPIAgent(tx.Querier, row) if err != nil { return err diff --git a/managed/services/management/mysql.go b/managed/services/management/mysql.go index 5493bbdffb..db1ad011fd 100644 --- a/managed/services/management/mysql.go +++ b/managed/services/management/mysql.go @@ -38,14 +38,16 @@ type MySQLService struct { state agentsStateUpdater cc connectionChecker vc versionCache + sib serviceInfoBroker } // NewMySQLService creates new MySQL Management Service. -func NewMySQLService(db *reform.DB, state agentsStateUpdater, cc connectionChecker, vc versionCache) *MySQLService { +func NewMySQLService(db *reform.DB, state agentsStateUpdater, cc connectionChecker, sib serviceInfoBroker, vc versionCache) *MySQLService { return &MySQLService{ db: db, state: state, cc: cc, + sib: sib, vc: vc, } } @@ -129,6 +131,10 @@ func (s *MySQLService) Add(ctx context.Context, req *managementpb.AddMySQLReques res.TableCount = *row.TableCount } + if err = s.sib.GetInfoFromService(ctx, tx.Querier, service, row); err != nil { + return err + } + agent, err := services.ToAPIAgent(tx.Querier, row) if err != nil { return err diff --git a/managed/services/management/postgresql.go b/managed/services/management/postgresql.go index dfdf559fa4..97cc5b6a05 100644 --- a/managed/services/management/postgresql.go +++ b/managed/services/management/postgresql.go @@ -32,14 +32,16 @@ type PostgreSQLService struct { db *reform.DB state agentsStateUpdater cc connectionChecker + sib serviceInfoBroker } // NewPostgreSQLService creates new PostgreSQL Management Service. -func NewPostgreSQLService(db *reform.DB, state agentsStateUpdater, cc connectionChecker) *PostgreSQLService { +func NewPostgreSQLService(db *reform.DB, state agentsStateUpdater, cc connectionChecker, sib serviceInfoBroker) *PostgreSQLService { return &PostgreSQLService{ db: db, state: state, cc: cc, + sib: sib, } } @@ -103,6 +105,10 @@ func (s *PostgreSQLService) Add(ctx context.Context, req *managementpb.AddPostgr } } + if err = s.sib.GetInfoFromService(ctx, tx.Querier, service, row); err != nil { + return err + } + agent, err := services.ToAPIAgent(tx.Querier, row) if err != nil { return err diff --git a/managed/services/management/proxysql.go b/managed/services/management/proxysql.go index 88b883bfff..e2ae481ed8 100644 --- a/managed/services/management/proxysql.go +++ b/managed/services/management/proxysql.go @@ -32,14 +32,16 @@ type ProxySQLService struct { db *reform.DB state agentsStateUpdater cc connectionChecker + sib serviceInfoBroker } // NewProxySQLService creates new ProxySQL Management Service. -func NewProxySQLService(db *reform.DB, state agentsStateUpdater, cc connectionChecker) *ProxySQLService { +func NewProxySQLService(db *reform.DB, state agentsStateUpdater, cc connectionChecker, sib serviceInfoBroker) *ProxySQLService { return &ProxySQLService{ db: db, state: state, cc: cc, + sib: sib, } } @@ -100,6 +102,10 @@ func (s *ProxySQLService) Add(ctx context.Context, req *managementpb.AddProxySQL } } + if err = s.sib.GetInfoFromService(ctx, tx.Querier, service, row); err != nil { + return err + } + agent, err := services.ToAPIAgent(tx.Querier, row) if err != nil { return err From f45cc2cd124d1a5fbbd60b033f5547945b867005 Mon Sep 17 00:00:00 2001 From: Alex Tymchuk Date: Mon, 18 Sep 2023 10:43:26 +0000 Subject: [PATCH 02/41] PMM-12375 serviceInfoBroker won't ping the db --- admin/commands/management/add_mysql.go | 2 +- .../serviceinfobroker/service_info_broker.go | 32 ++----------------- managed/services/management/mongodb.go | 2 +- managed/services/management/mysql.go | 5 +-- 4 files changed, 8 insertions(+), 33 deletions(-) diff --git a/admin/commands/management/add_mysql.go b/admin/commands/management/add_mysql.go index 13e5cd24ba..ca540b0e9f 100644 --- a/admin/commands/management/add_mysql.go +++ b/admin/commands/management/add_mysql.go @@ -146,7 +146,7 @@ func (cmd *AddMySQLCommand) RunCmd() (commands.Result, error) { if cmd.CreateUser { return nil, errors.New("Unrecognized option. To create a user, see " + - "'https://www.percona.com/doc/percona-monitoring-and-management/2.x/concepts/services-mysql.html#pmm-conf-mysql-user-account-creating'") + "'https://docs.percona.com/percona-monitoring-and-management/setting-up/client/mysql.html#create-a-database-account-for-pmm'") } var ( diff --git a/agent/serviceinfobroker/service_info_broker.go b/agent/serviceinfobroker/service_info_broker.go index 129228afe4..aa428e09e0 100644 --- a/agent/serviceinfobroker/service_info_broker.go +++ b/agent/serviceinfobroker/service_info_broker.go @@ -17,7 +17,6 @@ package serviceinfobroker import ( "context" - "crypto/x509" "database/sql" "fmt" "math" @@ -27,7 +26,6 @@ import ( "github.com/go-sql-driver/mysql" "github.com/lib/pq" - "github.com/pkg/errors" "github.com/sirupsen/logrus" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" @@ -59,14 +57,6 @@ func New(cfg configGetter) *ServiceInfoBroker { } } -func (sib *ServiceInfoBroker) sqlPing(ctx context.Context, db *sql.DB) error { - // use both query tag and SELECT value to cover both comments and values stripping by the server - var dest string - err := db.QueryRowContext(ctx, `SELECT /* agent='serviceinfobroker' */ 'pmm-agent'`).Scan(&dest) - sib.l.Debugf("sqlPing: %v", err) - return err -} - // GetInfoFromService gathers information from a service. It returns context cancelation/timeout or driver errors as is. func (sib *ServiceInfoBroker) GetInfoFromService(ctx context.Context, msg *agentpb.ServiceInfoRequest, id uint32) *agentpb.ServiceInfoResponse { timeout := msg.Timeout.AsDuration() @@ -85,7 +75,9 @@ func (sib *ServiceInfoBroker) GetInfoFromService(ctx context.Context, msg *agent return sib.getPostgreSQLInfo(ctx, msg.Dsn, msg.TextFiles, id) case inventorypb.ServiceType_PROXYSQL_SERVICE: return sib.getProxySQLInfo(ctx, msg.Dsn) - // NOTE: inventorypb.ServiceType_EXTERNAL_SERVICE, inventorypb.ServiceType_HAPROXY_SERVICE can't be implemented for now + // NOTE: these types can't be implemented for now. + case inventorypb.ServiceType_EXTERNAL_SERVICE, inventorypb.ServiceType_HAPROXY_SERVICE: + return &agentpb.ServiceInfoResponse{} default: panic(fmt.Sprintf("unknown service type: %v", msg.Type)) } @@ -129,16 +121,6 @@ func (sib *ServiceInfoBroker) getMySQLInfo(ctx context.Context, dsn string, file db := sql.OpenDB(connector) defer db.Close() //nolint:errcheck - if err = sib.sqlPing(ctx, db); err != nil { - if errors.As(err, &x509.HostnameError{}) { - res.Error = errors.Wrap(err, - "mysql ssl certificate is misconfigured, make sure the certificate includes the requested hostname/IP in CN or subjectAltName fields").Error() - } else { - res.Error = err.Error() - } - return &res - } - var count uint64 if err = db.QueryRowContext(ctx, "SELECT /* agent='serviceinfobroker' */ COUNT(*) FROM information_schema.tables").Scan(&count); err != nil { res.Error = err.Error() @@ -242,10 +224,6 @@ func (sib *ServiceInfoBroker) getPostgreSQLInfo(ctx context.Context, dsn string, db := sql.OpenDB(c) defer db.Close() //nolint:errcheck - if err = sib.sqlPing(ctx, db); err != nil { - res.Error = err.Error() - } - var version string if err = db.QueryRowContext(ctx, "SHOW /* agent='serviceinfobroker' */ SERVER_VERSION").Scan(&version); err != nil { res.Error = err.Error() @@ -275,10 +253,6 @@ func (sib *ServiceInfoBroker) getProxySQLInfo(ctx context.Context, dsn string) * db := sql.OpenDB(connector) defer db.Close() //nolint:errcheck - if err = sib.sqlPing(ctx, db); err != nil { - res.Error = err.Error() - } - var version string if err := db.QueryRowContext(ctx, "SELECT /* agent='serviceinfobroker' */ @@GLOBAL.'admin-version'").Scan(&version); err != nil { res.Error = err.Error() diff --git a/managed/services/management/mongodb.go b/managed/services/management/mongodb.go index 3aa0f7b465..e407949542 100644 --- a/managed/services/management/mongodb.go +++ b/managed/services/management/mongodb.go @@ -128,7 +128,7 @@ func (s *MongoDBService) Add(ctx context.Context, req *managementpb.AddMongoDBRe MongoDBOptions: mongoDBOptions, MaxQueryLength: req.MaxQueryLength, LogLevel: services.SpecifyLogLevel(req.LogLevel, inventorypb.LogLevel_fatal), - // TODO QueryExamplesDisabled https://jira.percona.com/browse/PMM-4650 + // TODO QueryExamplesDisabled https://jira.percona.com/browse/PMM-7860 }) if err != nil { return err diff --git a/managed/services/management/mysql.go b/managed/services/management/mysql.go index db1ad011fd..b31311751f 100644 --- a/managed/services/management/mysql.go +++ b/managed/services/management/mysql.go @@ -127,11 +127,12 @@ func (s *MySQLService) Add(ctx context.Context, req *managementpb.AddMySQLReques if err = s.cc.CheckConnectionToService(ctx, tx.Querier, service, row); err != nil { return err } - // CheckConnectionToService updates the table count in row so, let's also update the response - res.TableCount = *row.TableCount } if err = s.sib.GetInfoFromService(ctx, tx.Querier, service, row); err != nil { + // GetInfoFromService updates the table count in row so, let's also update the response + res.TableCount = *row.TableCount + return err } From a5efc3146ab9f95d56be66c34eafad8684a811b3 Mon Sep 17 00:00:00 2001 From: Alex Tymchuk Date: Mon, 18 Sep 2023 11:12:40 +0000 Subject: [PATCH 03/41] PMM-12375 fix the test --- admin/commands/management/add_mysql_test.go | 2 +- agent/serviceinfobroker/service_info_broker.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/admin/commands/management/add_mysql_test.go b/admin/commands/management/add_mysql_test.go index ce6e74c4d2..cf5c907ef6 100644 --- a/admin/commands/management/add_mysql_test.go +++ b/admin/commands/management/add_mysql_test.go @@ -155,7 +155,7 @@ func TestRun(t *testing.T) { _, err := cmd.RunCmd() if assert.Error(t, err) { - expected := "Unrecognized option. To create a user, see 'https://www.percona.com/doc/percona-monitoring-and-management/2.x/concepts/services-mysql.html#pmm-conf-mysql-user-account-creating'" + expected := "Unrecognized option. To create a user, see 'https://docs.percona.com/percona-monitoring-and-management/setting-up/client/mysql.html#create-a-database-account-for-pmm'" assert.Equal(t, expected, err.Error()) } }) diff --git a/agent/serviceinfobroker/service_info_broker.go b/agent/serviceinfobroker/service_info_broker.go index aa428e09e0..7ce5ae216c 100644 --- a/agent/serviceinfobroker/service_info_broker.go +++ b/agent/serviceinfobroker/service_info_broker.go @@ -75,7 +75,7 @@ func (sib *ServiceInfoBroker) GetInfoFromService(ctx context.Context, msg *agent return sib.getPostgreSQLInfo(ctx, msg.Dsn, msg.TextFiles, id) case inventorypb.ServiceType_PROXYSQL_SERVICE: return sib.getProxySQLInfo(ctx, msg.Dsn) - // NOTE: these types can't be implemented for now. + // NOTE: these types may be implemented later. case inventorypb.ServiceType_EXTERNAL_SERVICE, inventorypb.ServiceType_HAPROXY_SERVICE: return &agentpb.ServiceInfoResponse{} default: From c477cd2a20283b407be49a83438eb0a2dd04ba62 Mon Sep 17 00:00:00 2001 From: Alex Tymchuk Date: Mon, 18 Sep 2023 12:02:28 +0000 Subject: [PATCH 04/41] PMM-12375 add tests for serviceInfoBroker --- .../connection_checker_test.go | 4 +- .../service_info_broker_test.go | 270 ++++++++++++++++++ managed/services/agents/connection_checker.go | 6 +- 3 files changed, 275 insertions(+), 5 deletions(-) create mode 100644 agent/serviceinfobroker/service_info_broker_test.go diff --git a/agent/connectionchecker/connection_checker_test.go b/agent/connectionchecker/connection_checker_test.go index 94aef528fd..c0eb97e88a 100644 --- a/agent/connectionchecker/connection_checker_test.go +++ b/agent/connectionchecker/connection_checker_test.go @@ -237,7 +237,7 @@ func TestConnectionChecker(t *testing.T) { }) } - t.Run("TableCount", func(t *testing.T) { + t.Run("TableCount Absence", func(t *testing.T) { cfgStorage := config.NewStorage(&config.Config{ Paths: config.Paths{TempDir: t.TempDir()}, }) @@ -247,7 +247,7 @@ func TestConnectionChecker(t *testing.T) { Type: inventorypb.ServiceType_MYSQL_SERVICE, }, 0) require.NotNil(t, resp) - assert.InDelta(t, 250, resp.Stats.TableCount, 150) + assert.IsType(t, nil, resp.Stats) }) t.Run("MongoDBWithSSL", func(t *testing.T) { diff --git a/agent/serviceinfobroker/service_info_broker_test.go b/agent/serviceinfobroker/service_info_broker_test.go new file mode 100644 index 0000000000..94eb41552a --- /dev/null +++ b/agent/serviceinfobroker/service_info_broker_test.go @@ -0,0 +1,270 @@ +// Copyright 2019 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package serviceinfobroker + +import ( + "context" + "math/rand" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "google.golang.org/protobuf/types/known/durationpb" + + "github.com/percona/pmm/agent/config" + "github.com/percona/pmm/agent/utils/tests" + "github.com/percona/pmm/api/agentpb" + "github.com/percona/pmm/api/inventorypb" +) + +func TestServiceInfoBroker(t *testing.T) { + t.Parallel() + + testCases := []struct { + name string + req *agentpb.ServiceInfoRequest + expectedErr string + panic bool + }{ + { + name: "MySQL", + req: &agentpb.ServiceInfoRequest{ + Dsn: "root:root-password@tcp(127.0.0.1:3306)/?clientFoundRows=true&parseTime=true&timeout=1s", + Type: inventorypb.ServiceType_MYSQL_SERVICE, + Timeout: durationpb.New(3 * time.Second), + }, + }, + { + name: "MySQL wrong params", + req: &agentpb.ServiceInfoRequest{ + Dsn: "pmm-agent:pmm-agent-wrong-password@tcp(127.0.0.1:3306)/?clientFoundRows=true&parseTime=true&timeout=1s", + Type: inventorypb.ServiceType_MYSQL_SERVICE, + Timeout: durationpb.New(3 * time.Second), + }, + expectedErr: `Error 1045 \(28000\): Access denied for user 'pmm-agent'@'.+' \(using password: YES\)`, + }, + { + name: "MySQL timeout", + req: &agentpb.ServiceInfoRequest{ + Dsn: "root:root-password@tcp(127.0.0.1:3306)/?clientFoundRows=true&parseTime=true&timeout=10s", + Type: inventorypb.ServiceType_MYSQL_SERVICE, + Timeout: durationpb.New(time.Nanosecond), + }, + expectedErr: `context deadline exceeded`, + }, + + { + name: "MongoDB with no auth", + req: &agentpb.ServiceInfoRequest{ + Dsn: "mongodb://127.0.0.1:27019/admin?connectTimeoutMS=1000", + Type: inventorypb.ServiceType_MONGODB_SERVICE, + Timeout: durationpb.New(3 * time.Second), + }, + }, + { + name: "MongoDB with no auth with params", + req: &agentpb.ServiceInfoRequest{ + Dsn: "mongodb://root:root-password@127.0.0.1:27019/admin?connectTimeoutMS=1000", + Type: inventorypb.ServiceType_MONGODB_SERVICE, + Timeout: durationpb.New(3 * time.Second), + }, + expectedErr: `.*auth error: (sasl conversation error: )?unable to authenticate using mechanism "[\w-]+": ` + + `\(AuthenticationFailed\) Authentication failed.`, + }, + { + name: "MongoDB", + req: &agentpb.ServiceInfoRequest{ + Dsn: "mongodb://root:root-password@127.0.0.1:27017/admin?connectTimeoutMS=1000", + Type: inventorypb.ServiceType_MONGODB_SERVICE, + Timeout: durationpb.New(3 * time.Second), + }, + }, + { + name: "MongoDB no params", + req: &agentpb.ServiceInfoRequest{ + Dsn: "mongodb://127.0.0.1:27017/admin?connectTimeoutMS=1000", + Type: inventorypb.ServiceType_MONGODB_SERVICE, + Timeout: durationpb.New(3 * time.Second), + }, + expectedErr: `\(Unauthorized\) (?:command getDiagnosticData requires authentication|` + + `there are no users authenticated|` + + `not authorized on admin to execute command \{ getDiagnosticData\: 1 \})`, + }, + { + name: "MongoDB wrong params", + req: &agentpb.ServiceInfoRequest{ + Dsn: "mongodb://root:root-password-wrong@127.0.0.1:27017/admin?connectTimeoutMS=1000", + Type: inventorypb.ServiceType_MONGODB_SERVICE, + Timeout: durationpb.New(3 * time.Second), + }, + expectedErr: `.*auth error: (sasl conversation error: )?unable to authenticate using mechanism "[\w-]+": ` + + `\(AuthenticationFailed\) Authentication failed.`, + }, + { + name: "MongoDB timeout", + req: &agentpb.ServiceInfoRequest{ + Dsn: "mongodb://root:root-password@127.0.0.1:27017/admin?connectTimeoutMS=10000", + Type: inventorypb.ServiceType_MONGODB_SERVICE, + Timeout: durationpb.New(time.Nanosecond), + }, + expectedErr: `.*context deadline exceeded.*`, + }, + { + name: "MongoDB no database", + req: &agentpb.ServiceInfoRequest{ + Dsn: "mongodb://root:root-password@127.0.0.1:27017?connectTimeoutMS=1000", + Type: inventorypb.ServiceType_MONGODB_SERVICE, + Timeout: durationpb.New(3 * time.Second), + }, + expectedErr: `error parsing uri: must have a / before the query \?`, + }, + + { + name: "PostgreSQL", + req: &agentpb.ServiceInfoRequest{ + Dsn: "postgres://pmm-agent:pmm-agent-password@127.0.0.1:5432/postgres?connect_timeout=1&sslmode=disable", + Type: inventorypb.ServiceType_POSTGRESQL_SERVICE, + Timeout: durationpb.New(3 * time.Second), + }, + }, + { + name: "PostgreSQL wrong params", + req: &agentpb.ServiceInfoRequest{ + Dsn: "postgres://pmm-agent:pmm-agent-wrong-password@127.0.0.1:5432/postgres?connect_timeout=1&sslmode=disable", + Type: inventorypb.ServiceType_POSTGRESQL_SERVICE, + Timeout: durationpb.New(3 * time.Second), + }, + expectedErr: `pq: password authentication failed for user "pmm-agent"`, + }, + { + name: "PostgreSQL timeout", + req: &agentpb.ServiceInfoRequest{ + Dsn: "postgres://pmm-agent:pmm-agent-password@127.0.0.1:5432/postgres?connect_timeout=10&sslmode=disable", + Type: inventorypb.ServiceType_POSTGRESQL_SERVICE, + Timeout: durationpb.New(time.Nanosecond), + }, + expectedErr: `context deadline exceeded`, + }, + + // Use MySQL for ProxySQL tests for now. + // TODO https://jira.percona.com/browse/PMM-4930 + { + name: "ProxySQL/MySQL", + req: &agentpb.ServiceInfoRequest{ + Dsn: "root:root-password@tcp(127.0.0.1:3306)/?clientFoundRows=true&parseTime=true&timeout=1s", + Type: inventorypb.ServiceType_PROXYSQL_SERVICE, + Timeout: durationpb.New(3 * time.Second), + }, + }, + { + name: "ProxySQL/MySQL wrong params", + req: &agentpb.ServiceInfoRequest{ + Dsn: "pmm-agent:pmm-agent-wrong-password@tcp(127.0.0.1:3306)/?clientFoundRows=true&parseTime=true&timeout=1s", + Type: inventorypb.ServiceType_PROXYSQL_SERVICE, + Timeout: durationpb.New(3 * time.Second), + }, + expectedErr: `Error 1045 \(28000\): Access denied for user 'pmm-agent'@'.+' \(using password: YES\)`, + }, + { + name: "ProxySQL/MySQL timeout", + req: &agentpb.ServiceInfoRequest{ + Dsn: "root:root-password@tcp(127.0.0.1:3306)/?clientFoundRows=true&parseTime=true&timeout=10s", + Type: inventorypb.ServiceType_PROXYSQL_SERVICE, + Timeout: durationpb.New(time.Nanosecond), + }, + expectedErr: `context deadline exceeded`, + }, + { + name: "Invalid service type", + req: &agentpb.ServiceInfoRequest{ + Dsn: "root:root-password@tcp(127.0.0.1:3306)/?clientFoundRows=true&parseTime=true&timeout=10s", + Type: inventorypb.ServiceType_SERVICE_TYPE_INVALID, + Timeout: durationpb.New(time.Nanosecond), + }, + expectedErr: `unknown service type: SERVICE_TYPE_INVALID`, + panic: true, + }, + { + name: "Unknown service type", + req: &agentpb.ServiceInfoRequest{ + Dsn: "root:root-password@tcp(127.0.0.1:3306)/?clientFoundRows=true&parseTime=true&timeout=10s", + Type: inventorypb.ServiceType(12345), + Timeout: durationpb.New(time.Nanosecond), + }, + expectedErr: `unknown service type: 12345`, + panic: true, + }, + } + + for _, tt := range testCases { + tt := tt + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + cfgStorage := config.NewStorage(&config.Config{ + Paths: config.Paths{TempDir: t.TempDir()}, + }) + c := New(cfgStorage) + + if tt.panic { + require.PanicsWithValue(t, tt.expectedErr, func() { + c.GetInfoFromService(context.Background(), tt.req, 0) + }) + return + } + + resp := c.GetInfoFromService(context.Background(), tt.req, 0) + require.NotNil(t, resp) + if tt.expectedErr == "" { + assert.Empty(t, resp.Error) + } else { + require.NotEmpty(t, resp.Error) + assert.Regexp(t, `^`+tt.expectedErr+`$`, resp.Error) + } + }) + } + + t.Run("TableCount", func(t *testing.T) { + cfgStorage := config.NewStorage(&config.Config{ + Paths: config.Paths{TempDir: t.TempDir()}, + }) + c := New(cfgStorage) + resp := c.GetInfoFromService(context.Background(), &agentpb.ServiceInfoRequest{ + Dsn: "root:root-password@tcp(127.0.0.1:3306)/?clientFoundRows=true&parseTime=true&timeout=1s", + Type: inventorypb.ServiceType_MYSQL_SERVICE, + }, 0) + require.NotNil(t, resp) + assert.InDelta(t, 250, resp.TableCount, 150) + }) + + t.Run("MongoDBWithSSL", func(t *testing.T) { + mongoDBDSNWithSSL, mongoDBTextFiles := tests.GetTestMongoDBWithSSLDSN(t, "../") + + cfgStorage := config.NewStorage(&config.Config{ + Paths: config.Paths{TempDir: t.TempDir()}, + }) + + c := New(cfgStorage) + resp := c.GetInfoFromService(context.Background(), &agentpb.ServiceInfoRequest{ + Dsn: mongoDBDSNWithSSL, + Type: inventorypb.ServiceType_MONGODB_SERVICE, + Timeout: durationpb.New(30 * time.Second), + TextFiles: mongoDBTextFiles, + }, rand.Uint32()) //nolint:gosec + require.NotNil(t, resp) + assert.Empty(t, resp.Error) + }) +} diff --git a/managed/services/agents/connection_checker.go b/managed/services/agents/connection_checker.go index f53c8c686f..1c556ddf7b 100644 --- a/managed/services/agents/connection_checker.go +++ b/managed/services/agents/connection_checker.go @@ -61,11 +61,11 @@ func (c *ConnectionChecker) CheckConnectionToService(ctx context.Context, q *ref switch service.ServiceType { case models.MySQLServiceType, - models.ExternalServiceType, - models.HAProxyServiceType, models.PostgreSQLServiceType, models.MongoDBServiceType, - models.ProxySQLServiceType: + models.ProxySQLServiceType, + models.ExternalServiceType, + models.HAProxyServiceType: default: return errors.Errorf("unhandled Service type %s", service.ServiceType) } From 1092e4acb7c0db89c169c0557892a239950c8716 Mon Sep 17 00:00:00 2001 From: Alex Tymchuk Date: Mon, 18 Sep 2023 14:31:09 +0000 Subject: [PATCH 05/41] PMM-12375 fix the agent tests --- agent/connectionchecker/connection_checker_test.go | 5 +++-- agent/serviceinfobroker/service_info_broker_test.go | 2 ++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/agent/connectionchecker/connection_checker_test.go b/agent/connectionchecker/connection_checker_test.go index c0eb97e88a..18ee89d1d5 100644 --- a/agent/connectionchecker/connection_checker_test.go +++ b/agent/connectionchecker/connection_checker_test.go @@ -237,7 +237,7 @@ func TestConnectionChecker(t *testing.T) { }) } - t.Run("TableCount Absence", func(t *testing.T) { + t.Run("Stats should be empty", func(t *testing.T) { cfgStorage := config.NewStorage(&config.Config{ Paths: config.Paths{TempDir: t.TempDir()}, }) @@ -247,7 +247,8 @@ func TestConnectionChecker(t *testing.T) { Type: inventorypb.ServiceType_MYSQL_SERVICE, }, 0) require.NotNil(t, resp) - assert.IsType(t, nil, resp.Stats) + // CheckConnectionResponse_Stats are deprecated, but we can't remove them yet without breaking older clients. + assert.Equal(t, (*agentpb.CheckConnectionResponse_Stats)(nil), resp.Stats) //nolint:staticcheck }) t.Run("MongoDBWithSSL", func(t *testing.T) { diff --git a/agent/serviceinfobroker/service_info_broker_test.go b/agent/serviceinfobroker/service_info_broker_test.go index 94eb41552a..61b3efb0b4 100644 --- a/agent/serviceinfobroker/service_info_broker_test.go +++ b/agent/serviceinfobroker/service_info_broker_test.go @@ -161,6 +161,7 @@ func TestServiceInfoBroker(t *testing.T) { // Use MySQL for ProxySQL tests for now. // TODO https://jira.percona.com/browse/PMM-4930 + // NOTE the above will also fix the error `Error 1193 (HY000): Unknown system variable 'admin-version'` { name: "ProxySQL/MySQL", req: &agentpb.ServiceInfoRequest{ @@ -168,6 +169,7 @@ func TestServiceInfoBroker(t *testing.T) { Type: inventorypb.ServiceType_PROXYSQL_SERVICE, Timeout: durationpb.New(3 * time.Second), }, + expectedErr: `Error 1193 \(HY000\): Unknown system variable 'admin-version'`, }, { name: "ProxySQL/MySQL wrong params", From 6f896b3e164d2188ec859b8ff700f2601deea850 Mon Sep 17 00:00:00 2001 From: Alex Tymchuk Date: Mon, 18 Sep 2023 14:45:06 +0000 Subject: [PATCH 06/41] PMM-12375 fix agent tests, server-side --- managed/services/inventory/agents_test.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/managed/services/inventory/agents_test.go b/managed/services/inventory/agents_test.go index 3e9082bd87..9b201063c2 100644 --- a/managed/services/inventory/agents_test.go +++ b/managed/services/inventory/agents_test.go @@ -50,6 +50,10 @@ func TestAgents(t *testing.T) { mock.AnythingOfType(reflect.TypeOf(&reform.TX{}).Name()), mock.AnythingOfType(reflect.TypeOf(&models.Service{}).Name()), mock.AnythingOfType(reflect.TypeOf(&models.Agent{}).Name())).Return(nil) + as.sib.(*mockServiceInfoBroker).On("GetInfoFromService", ctx, + mock.AnythingOfType(reflect.TypeOf(&reform.TX{}).Name()), + mock.AnythingOfType(reflect.TypeOf(&models.Service{}).Name()), + mock.AnythingOfType(reflect.TypeOf(&models.Agent{}).Name())).Return(nil) as.vmdb.(*mockPrometheusService).On("RequestConfigurationUpdate").Return() pmmAgent, err := as.AddPMMAgent(ctx, &inventorypb.AddPMMAgentRequest{ @@ -453,6 +457,10 @@ func TestAgents(t *testing.T) { mock.AnythingOfType(reflect.TypeOf(&reform.TX{}).Name()), mock.AnythingOfType(reflect.TypeOf(&models.Service{}).Name()), mock.AnythingOfType(reflect.TypeOf(&models.Agent{}).Name())).Return(nil) + as.sib.(*mockServiceInfoBroker).On("GetInfoFromService", ctx, + mock.AnythingOfType(reflect.TypeOf(&reform.TX{}).Name()), + mock.AnythingOfType(reflect.TypeOf(&models.Service{}).Name()), + mock.AnythingOfType(reflect.TypeOf(&models.Agent{}).Name())).Return(nil) pmmAgent, err := as.AddPMMAgent(ctx, &inventorypb.AddPMMAgentRequest{ RunsOnNodeId: models.PMMServerNodeID, @@ -539,6 +547,10 @@ func TestAgents(t *testing.T) { mock.AnythingOfType(reflect.TypeOf(&reform.TX{}).Name()), mock.AnythingOfType(reflect.TypeOf(&models.Service{}).Name()), mock.AnythingOfType(reflect.TypeOf(&models.Agent{}).Name())).Return(nil) + as.sib.(*mockServiceInfoBroker).On("GetInfoFromService", ctx, + mock.AnythingOfType(reflect.TypeOf(&reform.TX{}).Name()), + mock.AnythingOfType(reflect.TypeOf(&models.Service{}).Name()), + mock.AnythingOfType(reflect.TypeOf(&models.Agent{}).Name())).Return(nil) pmmAgent, err := as.AddPMMAgent(ctx, &inventorypb.AddPMMAgentRequest{ RunsOnNodeId: models.PMMServerNodeID, @@ -590,6 +602,10 @@ func TestAgents(t *testing.T) { mock.AnythingOfType(reflect.TypeOf(&reform.TX{}).Name()), mock.AnythingOfType(reflect.TypeOf(&models.Service{}).Name()), mock.AnythingOfType(reflect.TypeOf(&models.Agent{}).Name())).Return(nil) + as.sib.(*mockServiceInfoBroker).On("GetInfoFromService", ctx, + mock.AnythingOfType(reflect.TypeOf(&reform.TX{}).Name()), + mock.AnythingOfType(reflect.TypeOf(&models.Service{}).Name()), + mock.AnythingOfType(reflect.TypeOf(&models.Agent{}).Name())).Return(nil) pmmAgent, err := as.AddPMMAgent(ctx, &inventorypb.AddPMMAgentRequest{ RunsOnNodeId: models.PMMServerNodeID, From 8f61035c1633cc6b4418809638abfb4d1bd1bc4e Mon Sep 17 00:00:00 2001 From: Alex Tymchuk Date: Mon, 18 Sep 2023 14:55:33 +0000 Subject: [PATCH 07/41] PMM-12375 fix services tests --- managed/services/inventory/services_test.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/managed/services/inventory/services_test.go b/managed/services/inventory/services_test.go index d5a39b4dda..239b77ded1 100644 --- a/managed/services/inventory/services_test.go +++ b/managed/services/inventory/services_test.go @@ -144,6 +144,10 @@ func TestServices(t *testing.T) { mock.AnythingOfType(reflect.TypeOf(&reform.TX{}).Name()), mock.AnythingOfType(reflect.TypeOf(&models.Service{}).Name()), mock.AnythingOfType(reflect.TypeOf(&models.Agent{}).Name())).Return(nil) + as.sib.(*mockServiceInfoBroker).On("GetInfoFromService", ctx, + mock.AnythingOfType(reflect.TypeOf(&reform.TX{}).Name()), + mock.AnythingOfType(reflect.TypeOf(&models.Service{}).Name()), + mock.AnythingOfType(reflect.TypeOf(&models.Agent{}).Name())).Return(nil) node, err := ns.AddRemoteRDSNode(ctx, &inventorypb.AddRemoteRDSNodeRequest{NodeName: "test1", Region: "test-region", Address: "test"}) require.NoError(t, err) @@ -202,6 +206,10 @@ func TestServices(t *testing.T) { mock.AnythingOfType(reflect.TypeOf(&reform.TX{}).Name()), mock.AnythingOfType(reflect.TypeOf(&models.Service{}).Name()), mock.AnythingOfType(reflect.TypeOf(&models.Agent{}).Name())).Return(nil) + as.sib.(*mockServiceInfoBroker).On("GetInfoFromService", ctx, + mock.AnythingOfType(reflect.TypeOf(&reform.TX{}).Name()), + mock.AnythingOfType(reflect.TypeOf(&models.Service{}).Name()), + mock.AnythingOfType(reflect.TypeOf(&models.Agent{}).Name())).Return(nil) node, err := ns.AddRemoteAzureDatabaseNode(ctx, &inventorypb.AddRemoteAzureDatabaseNodeRequest{NodeName: "test1", Region: "test-region", Address: "test"}) require.NoError(t, err) From ac80cad7a52452371b1da49730496f3e8b822d5c Mon Sep 17 00:00:00 2001 From: Alex Tymchuk Date: Tue, 19 Sep 2023 08:28:10 +0000 Subject: [PATCH 08/41] PMM-12375 do not update if version is empty --- managed/services/agents/channel/channel.go | 2 +- managed/services/agents/service_info_broker.go | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/managed/services/agents/channel/channel.go b/managed/services/agents/channel/channel.go index 5eec34e666..9153066248 100644 --- a/managed/services/agents/channel/channel.go +++ b/managed/services/agents/channel/channel.go @@ -201,7 +201,7 @@ func (c *Channel) send(msg *agentpb.ServerMessage) { atomic.AddUint32(&c.mSent, 1) } -// runReader receives messages from server. +// runReceiver receives messages from server. func (c *Channel) runReceiver() { defer func() { close(c.requests) diff --git a/managed/services/agents/service_info_broker.go b/managed/services/agents/service_info_broker.go index 3513dcb0af..4223365a7f 100644 --- a/managed/services/agents/service_info_broker.go +++ b/managed/services/agents/service_info_broker.go @@ -197,8 +197,12 @@ func updateServiceVersion(ctx context.Context, q *reform.Querier, resp agentpb.A l := logger.Get(ctx) version := resp.(*agentpb.ServiceInfoResponse).GetVersion() //nolint:forcetypeassert - service.Version = version + if version == "" { + return nil + } + l.Debugf("Updating service version: %s.", version) + service.Version = version if err := q.Update(service); err != nil { return errors.Wrap(err, "failed to update service version") } From 5b4b3883f0220d5519bbeb2db798f30d08f393d5 Mon Sep 17 00:00:00 2001 From: Alex Tymchuk Date: Tue, 19 Sep 2023 09:22:49 +0000 Subject: [PATCH 09/41] PMM-12375 remove the unused parameter --- agent/serviceinfobroker/service_info_broker.go | 4 ++-- managed/services/agents/grpc/agent_server.go | 2 +- managed/services/agents/log_level.go | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/agent/serviceinfobroker/service_info_broker.go b/agent/serviceinfobroker/service_info_broker.go index 7ce5ae216c..156baa66df 100644 --- a/agent/serviceinfobroker/service_info_broker.go +++ b/agent/serviceinfobroker/service_info_broker.go @@ -68,7 +68,7 @@ func (sib *ServiceInfoBroker) GetInfoFromService(ctx context.Context, msg *agent switch msg.Type { case inventorypb.ServiceType_MYSQL_SERVICE: - return sib.getMySQLInfo(ctx, msg.Dsn, msg.TextFiles, msg.TlsSkipVerify, id) + return sib.getMySQLInfo(ctx, msg.Dsn, msg.TextFiles, id) case inventorypb.ServiceType_MONGODB_SERVICE: return sib.getMongoDBInfo(ctx, msg.Dsn, msg.TextFiles, id) case inventorypb.ServiceType_POSTGRESQL_SERVICE: @@ -83,7 +83,7 @@ func (sib *ServiceInfoBroker) GetInfoFromService(ctx context.Context, msg *agent } } -func (sib *ServiceInfoBroker) getMySQLInfo(ctx context.Context, dsn string, files *agentpb.TextFiles, tlsSkipVerify bool, id uint32) *agentpb.ServiceInfoResponse { //nolint:lll,unparam +func (sib *ServiceInfoBroker) getMySQLInfo(ctx context.Context, dsn string, files *agentpb.TextFiles, id uint32) *agentpb.ServiceInfoResponse { //nolint:lll var res agentpb.ServiceInfoResponse var err error diff --git a/managed/services/agents/grpc/agent_server.go b/managed/services/agents/grpc/agent_server.go index 42ef5b0d09..6c957ddd95 100644 --- a/managed/services/agents/grpc/agent_server.go +++ b/managed/services/agents/grpc/agent_server.go @@ -40,7 +40,7 @@ func (s *agentServer) Connect(stream agentpb.Agent_ConnectServer) error { return s.handler.Run(stream) } -// check interfaces +// check interfaces. var ( _ agentpb.AgentServer = (*agentServer)(nil) ) diff --git a/managed/services/agents/log_level.go b/managed/services/agents/log_level.go index 57f236c1f0..4ec107bdf0 100644 --- a/managed/services/agents/log_level.go +++ b/managed/services/agents/log_level.go @@ -22,11 +22,11 @@ import ( "github.com/percona/pmm/version" ) -// Log level available in exporters with pmm 2.28 +// Log level available in exporters with pmm 2.28.0 and up. var exporterLogLevelCommandVersion = version.MustParse("2.27.99") // withLogLevel - append CLI args --log.level -// mysqld_exporter, node_exporter and postgres_exporter don't support --log.level=fatal +// mysqld_exporter, node_exporter and postgres_exporter don't support --log.level=fatal. func withLogLevel(args []string, logLevel *string, pmmAgentVersion *version.Parsed, supportLogLevelFatal bool) []string { level := pointer.GetString(logLevel) From df9067251cfc372ee900d830a5fce93eddbcdce5 Mon Sep 17 00:00:00 2001 From: Alex Tymchuk Date: Wed, 20 Sep 2023 14:32:48 +0000 Subject: [PATCH 10/41] PMM-12375 remove the version from Stats --- .../serviceinfobroker/service_info_broker.go | 1 - api/agentpb/agent.pb.go | 886 +++++++++--------- api/agentpb/agent.pb.validate.go | 2 - api/agentpb/agent.proto | 1 - 4 files changed, 438 insertions(+), 452 deletions(-) diff --git a/agent/serviceinfobroker/service_info_broker.go b/agent/serviceinfobroker/service_info_broker.go index 156baa66df..d22bcd5b9a 100644 --- a/agent/serviceinfobroker/service_info_broker.go +++ b/agent/serviceinfobroker/service_info_broker.go @@ -256,7 +256,6 @@ func (sib *ServiceInfoBroker) getProxySQLInfo(ctx context.Context, dsn string) * var version string if err := db.QueryRowContext(ctx, "SELECT /* agent='serviceinfobroker' */ @@GLOBAL.'admin-version'").Scan(&version); err != nil { res.Error = err.Error() - return &res } res.Version = version diff --git a/api/agentpb/agent.pb.go b/api/agentpb/agent.pb.go index 6074a9d2ac..314a5563ca 100644 --- a/api/agentpb/agent.pb.go +++ b/api/agentpb/agent.pb.go @@ -5258,8 +5258,7 @@ type CheckConnectionResponse_Stats struct { unknownFields protoimpl.UnknownFields // A number of tables, 0 if unknown. - TableCount int32 `protobuf:"varint,1,opt,name=table_count,json=tableCount,proto3" json:"table_count,omitempty"` - Version string `protobuf:"bytes,2,opt,name=version,proto3" json:"version,omitempty"` + TableCount int32 `protobuf:"varint,1,opt,name=table_count,json=tableCount,proto3" json:"table_count,omitempty"` } func (x *CheckConnectionResponse_Stats) Reset() { @@ -5301,13 +5300,6 @@ func (x *CheckConnectionResponse_Stats) GetTableCount() int32 { return 0 } -func (x *CheckConnectionResponse_Stats) GetVersion() string { - if x != nil { - return x.Version - } - return "" -} - // MySQLBackup is job for backup MySQL service. type StartJobRequest_MySQLBackup struct { state protoimpl.MessageState @@ -7319,108 +7311,94 @@ var file_agentpb_agent_proto_rawDesc = []byte{ 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x09, 0x74, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, - 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x22, 0xb3, 0x01, 0x0a, 0x17, 0x43, 0x68, 0x65, + 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x22, 0x99, 0x01, 0x0a, 0x17, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x3e, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, - 0x02, 0x18, 0x01, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x1a, 0x42, 0x0a, 0x05, 0x53, 0x74, + 0x02, 0x18, 0x01, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x1a, 0x28, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xe0, - 0x01, 0x0a, 0x12, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, - 0x65, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x64, 0x73, 0x6e, 0x12, 0x33, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x2f, 0x0a, 0x0a, 0x74, 0x65, 0x78, 0x74, - 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x09, - 0x74, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, - 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, - 0x79, 0x22, 0x66, 0x0a, 0x13, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x1f, - 0x0a, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, - 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x0a, 0x10, 0x4a, 0x6f, 0x62, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, - 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, - 0x6f, 0x62, 0x49, 0x64, 0x22, 0x29, 0x0a, 0x11, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x6c, 0x69, - 0x76, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x76, 0x65, 0x22, - 0xb2, 0x01, 0x0a, 0x10, 0x53, 0x33, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, - 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4b, 0x65, 0x79, 0x12, - 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x1f, - 0x0a, 0x0b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x23, 0x0a, 0x0d, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, - 0x67, 0x69, 0x6f, 0x6e, 0x22, 0x2e, 0x0a, 0x18, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, - 0x65, 0x6d, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x70, 0x61, 0x74, 0x68, 0x22, 0xc3, 0x0f, 0x0a, 0x0f, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, - 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x12, - 0x33, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x74, 0x69, 0x6d, - 0x65, 0x6f, 0x75, 0x74, 0x12, 0x47, 0x0a, 0x0c, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x62, 0x61, - 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x67, 0x65, + 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xe0, 0x01, 0x0a, 0x12, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, + 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, + 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x73, 0x6e, 0x12, 0x33, 0x0a, 0x07, 0x74, 0x69, 0x6d, + 0x65, 0x6f, 0x75, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x2f, + 0x0a, 0x0a, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x46, + 0x69, 0x6c, 0x65, 0x73, 0x52, 0x09, 0x74, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, + 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, + 0x66, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, + 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x22, 0x66, 0x0a, 0x13, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, + 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, + 0x29, 0x0a, 0x10, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x22, 0x29, 0x0a, 0x11, 0x4a, 0x6f, + 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x76, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, + 0x61, 0x6c, 0x69, 0x76, 0x65, 0x22, 0xb2, 0x01, 0x0a, 0x10, 0x53, 0x33, 0x4c, 0x6f, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, + 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, + 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, + 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x63, 0x72, 0x65, + 0x74, 0x4b, 0x65, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x75, 0x63, 0x6b, 0x65, + 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, + 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x62, 0x75, + 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x22, 0x2e, 0x0a, 0x18, 0x46, 0x69, + 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x22, 0xc3, 0x0f, 0x0a, 0x0f, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, + 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x12, 0x33, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x47, 0x0a, 0x0c, 0x6d, 0x79, + 0x73, 0x71, 0x6c, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x22, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, + 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x42, 0x61, + 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x0b, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x42, 0x61, 0x63, + 0x6b, 0x75, 0x70, 0x12, 0x5d, 0x0a, 0x14, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x72, 0x65, 0x73, + 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0c, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4a, + 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x52, + 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x12, + 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, + 0x75, 0x70, 0x12, 0x4d, 0x0a, 0x0e, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x62, 0x61, + 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, - 0x52, 0x0b, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x5d, 0x0a, - 0x14, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x62, - 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, - 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x12, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x52, - 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x4d, 0x0a, 0x0e, - 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0d, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, - 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x6f, 0x6e, - 0x67, 0x6f, 0x44, 0x42, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x0d, 0x6d, 0x6f, - 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x63, 0x0a, 0x16, 0x6d, - 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x62, - 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x52, 0x65, 0x73, 0x74, 0x6f, - 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x14, 0x6d, 0x6f, 0x6e, 0x67, - 0x6f, 0x64, 0x62, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, - 0x1a, 0x93, 0x02, 0x0a, 0x0b, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, - 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x75, 0x73, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, - 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, - 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x16, - 0x0a, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x33, - 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x33, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x08, 0x73, 0x33, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x42, 0x11, 0x0a, 0x0f, 0x6c, 0x6f, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4a, 0x04, 0x08, - 0x0b, 0x10, 0x0c, 0x52, 0x11, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0xc3, 0x01, 0x0a, 0x12, 0x4d, 0x79, 0x53, 0x51, 0x4c, - 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x1d, 0x0a, - 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x74, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, + 0x48, 0x00, 0x52, 0x0d, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x42, 0x61, 0x63, 0x6b, 0x75, + 0x70, 0x12, 0x63, 0x0a, 0x16, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x72, 0x65, 0x73, + 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0e, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x2b, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4a, + 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, + 0x42, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, + 0x52, 0x14, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, + 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x1a, 0x93, 0x02, 0x0a, 0x0b, 0x4d, 0x79, 0x53, 0x51, 0x4c, + 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, + 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, + 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, + 0x70, 0x6f, 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x33, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x33, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x08, @@ -7428,357 +7406,369 @@ var file_agentpb_agent_proto_rawDesc = []byte{ 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x42, 0x11, 0x0a, 0x0f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4a, 0x04, 0x08, 0x0b, 0x10, 0x0c, 0x52, 0x11, 0x66, 0x69, 0x6c, 0x65, 0x73, - 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0xf9, 0x03, 0x0a, - 0x0d, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x16, - 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, - 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, - 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x08, 0x70, 0x61, - 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x1c, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x07, 0x61, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x12, 0x16, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x05, 0x42, 0x02, 0x18, 0x01, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x06, - 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, - 0x52, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, - 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x69, 0x74, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0a, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x69, 0x74, 0x72, 0x12, 0x33, 0x0a, - 0x0a, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x14, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x61, - 0x74, 0x61, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x09, 0x64, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x64, - 0x65, 0x6c, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x33, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x33, - 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, - 0x52, 0x08, 0x73, 0x33, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x4e, 0x0a, 0x11, 0x66, 0x69, - 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, - 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x46, 0x69, - 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x10, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, - 0x73, 0x74, 0x65, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x6f, - 0x6c, 0x64, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x6f, 0x6c, 0x64, - 0x65, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x64, 0x73, 0x6e, 0x12, 0x2f, 0x0a, 0x0a, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x66, 0x69, 0x6c, - 0x65, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x2e, 0x54, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x09, 0x74, 0x65, 0x78, 0x74, - 0x46, 0x69, 0x6c, 0x65, 0x73, 0x42, 0x11, 0x0a, 0x0f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0xa8, 0x04, 0x0a, 0x14, 0x4d, 0x6f, 0x6e, - 0x67, 0x6f, 0x44, 0x42, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, - 0x70, 0x12, 0x16, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x02, 0x18, 0x01, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x08, 0x70, 0x61, 0x73, - 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, - 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x1c, 0x0a, 0x07, 0x61, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x07, - 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x16, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x05, 0x42, 0x02, 0x18, 0x01, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, - 0x1a, 0x0a, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x02, 0x18, 0x01, 0x52, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x41, 0x0a, 0x0e, 0x70, 0x69, 0x74, 0x72, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x18, 0x07, 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, 0x0d, 0x70, 0x69, 0x74, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x33, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x33, - 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, - 0x52, 0x08, 0x73, 0x33, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x4e, 0x0a, 0x11, 0x66, 0x69, - 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, - 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x46, 0x69, - 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x10, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, - 0x73, 0x74, 0x65, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x6f, - 0x6c, 0x64, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x6f, 0x6c, 0x64, - 0x65, 0x72, 0x12, 0x39, 0x0a, 0x0c, 0x70, 0x62, 0x6d, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, - 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x62, 0x6d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x52, 0x0b, 0x70, 0x62, 0x6d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x10, 0x0a, - 0x03, 0x64, 0x73, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x73, 0x6e, 0x12, - 0x2f, 0x0a, 0x0a, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0f, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, - 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x09, 0x74, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, - 0x42, 0x11, 0x0a, 0x0f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x42, 0x05, 0x0a, 0x03, 0x6a, 0x6f, 0x62, 0x22, 0x28, 0x0a, 0x10, 0x53, 0x74, - 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x22, 0x27, 0x0a, 0x0e, 0x53, 0x74, 0x6f, 0x70, 0x4a, 0x6f, 0x62, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x22, 0x11, 0x0a, - 0x0f, 0x53, 0x74, 0x6f, 0x70, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0xdb, 0x05, 0x0a, 0x09, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x15, - 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x18, 0x02, 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, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, - 0x2e, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, - 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, - 0x41, 0x0a, 0x0c, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, - 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, - 0x62, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x42, 0x61, 0x63, - 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x0b, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x42, 0x61, 0x63, 0x6b, - 0x75, 0x70, 0x12, 0x57, 0x0a, 0x14, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x74, - 0x6f, 0x72, 0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x23, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, - 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x12, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x52, 0x65, - 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x47, 0x0a, 0x0e, 0x6d, - 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0e, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x52, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x42, 0x61, 0x63, - 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x0d, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x42, 0x61, - 0x63, 0x6b, 0x75, 0x70, 0x12, 0x5d, 0x0a, 0x16, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, - 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0f, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, - 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x52, 0x65, - 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x14, 0x6d, - 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, - 0x6b, 0x75, 0x70, 0x1a, 0x21, 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x18, 0x0a, 0x07, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x6e, 0x0a, 0x0d, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, - 0x42, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x2c, 0x0a, 0x12, 0x69, 0x73, 0x5f, 0x73, 0x68, - 0x61, 0x72, 0x64, 0x65, 0x64, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x10, 0x69, 0x73, 0x53, 0x68, 0x61, 0x72, 0x64, 0x65, 0x64, 0x43, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x2f, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, - 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3e, 0x0a, 0x0b, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x42, - 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x2f, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, - 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x14, 0x0a, 0x12, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x52, - 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x1a, 0x16, 0x0a, 0x14, - 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, - 0x63, 0x6b, 0x75, 0x70, 0x42, 0x08, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0xa7, - 0x03, 0x0a, 0x0b, 0x4a, 0x6f, 0x62, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x15, - 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x18, 0x02, 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, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, - 0x43, 0x0a, 0x0c, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, - 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, - 0x62, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x42, - 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x0b, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x42, 0x61, - 0x63, 0x6b, 0x75, 0x70, 0x12, 0x59, 0x0a, 0x14, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x72, 0x65, - 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0c, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x50, 0x72, - 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x52, 0x65, 0x73, 0x74, - 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x12, 0x6d, 0x79, 0x73, - 0x71, 0x6c, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, - 0x2d, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, - 0x73, 0x2e, 0x4c, 0x6f, 0x67, 0x73, 0x48, 0x00, 0x52, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x1a, 0x0d, - 0x0a, 0x0b, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x1a, 0x14, 0x0a, + 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0xc3, 0x01, 0x0a, 0x12, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, - 0x6b, 0x75, 0x70, 0x1a, 0x49, 0x0a, 0x04, 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x63, - 0x68, 0x75, 0x6e, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x63, - 0x68, 0x75, 0x6e, 0x6b, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x6f, - 0x6e, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x6f, 0x6e, 0x65, 0x42, 0x08, - 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x9d, 0x04, 0x0a, 0x12, 0x47, 0x65, 0x74, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x40, 0x0a, 0x09, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x53, 0x6f, - 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x52, 0x09, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, - 0x73, 0x1a, 0x08, 0x0a, 0x06, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x1a, 0x0c, 0x0a, 0x0a, 0x58, - 0x74, 0x72, 0x61, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x1a, 0x09, 0x0a, 0x07, 0x58, 0x62, 0x63, - 0x6c, 0x6f, 0x75, 0x64, 0x1a, 0x08, 0x0a, 0x06, 0x51, 0x70, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x09, - 0x0a, 0x07, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x1a, 0x05, 0x0a, 0x03, 0x50, 0x42, 0x4d, - 0x1a, 0x85, 0x03, 0x0a, 0x08, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x12, 0x3a, 0x0a, - 0x06, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x48, - 0x00, 0x52, 0x06, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x12, 0x46, 0x0a, 0x0a, 0x78, 0x74, 0x72, - 0x61, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x58, 0x74, 0x72, 0x61, 0x62, 0x61, 0x63, - 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x0a, 0x78, 0x74, 0x72, 0x61, 0x62, 0x61, 0x63, 0x6b, 0x75, - 0x70, 0x12, 0x3d, 0x0a, 0x07, 0x78, 0x62, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x6b, 0x75, 0x70, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x33, 0x5f, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x2e, 0x53, 0x33, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x48, 0x00, 0x52, 0x08, 0x73, 0x33, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x16, + 0x0a, 0x06, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x42, 0x11, 0x0a, 0x0f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4a, 0x04, 0x08, 0x0b, 0x10, 0x0c, 0x52, + 0x11, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x1a, 0xf9, 0x03, 0x0a, 0x0d, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x42, 0x61, + 0x63, 0x6b, 0x75, 0x70, 0x12, 0x16, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x08, + 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, + 0x18, 0x01, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x1c, 0x0a, 0x07, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, + 0x01, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x16, 0x0a, 0x04, 0x70, 0x6f, + 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x42, 0x02, 0x18, 0x01, 0x52, 0x04, 0x70, 0x6f, + 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x69, 0x74, + 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x50, + 0x69, 0x74, 0x72, 0x12, 0x33, 0x0a, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, + 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x09, 0x64, + 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x33, 0x5f, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x33, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x08, 0x73, 0x33, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x12, 0x4e, 0x0a, 0x11, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x4c, 0x6f, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x10, + 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x12, 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, 0x18, + 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x73, 0x6e, 0x12, 0x2f, 0x0a, 0x0a, 0x74, 0x65, + 0x78, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, + 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, + 0x52, 0x09, 0x74, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x42, 0x11, 0x0a, 0x0f, 0x6c, + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0xa8, + 0x04, 0x0a, 0x14, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, + 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x16, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, + 0x1e, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, + 0x1c, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x02, 0x18, 0x01, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x16, 0x0a, + 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x42, 0x02, 0x18, 0x01, 0x52, + 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, + 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x41, 0x0a, 0x0e, 0x70, 0x69, 0x74, 0x72, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x07, 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, 0x0d, 0x70, 0x69, 0x74, 0x72, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x33, 0x5f, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x33, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x08, 0x73, 0x33, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x12, 0x4e, 0x0a, 0x11, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x4c, 0x6f, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x10, + 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x12, 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x12, 0x39, 0x0a, 0x0c, 0x70, 0x62, 0x6d, 0x5f, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, + 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x62, 0x6d, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x0b, 0x70, 0x62, 0x6d, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x64, 0x73, 0x6e, 0x12, 0x2f, 0x0a, 0x0a, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x66, 0x69, + 0x6c, 0x65, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x09, 0x74, 0x65, 0x78, + 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x42, 0x11, 0x0a, 0x0f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x05, 0x0a, 0x03, 0x6a, 0x6f, 0x62, + 0x22, 0x28, 0x0a, 0x10, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x27, 0x0a, 0x0e, 0x53, 0x74, + 0x6f, 0x70, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, + 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, + 0x62, 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x53, 0x74, 0x6f, 0x70, 0x4a, 0x6f, 0x62, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xdb, 0x05, 0x0a, 0x09, 0x4a, 0x6f, 0x62, 0x52, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x09, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 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, 0x09, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2e, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x0a, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, + 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x05, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x41, 0x0a, 0x0c, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x62, + 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x4d, 0x79, + 0x53, 0x51, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x0b, 0x6d, 0x79, 0x73, + 0x71, 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x57, 0x0a, 0x14, 0x6d, 0x79, 0x73, 0x71, + 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, + 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, + 0x6f, 0x62, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x52, 0x65, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x12, 0x6d, + 0x79, 0x73, 0x71, 0x6c, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, + 0x70, 0x12, 0x47, 0x0a, 0x0e, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x62, 0x61, 0x63, + 0x6b, 0x75, 0x70, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, + 0x6f, 0x44, 0x42, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x0d, 0x6d, 0x6f, 0x6e, + 0x67, 0x6f, 0x64, 0x62, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x5d, 0x0a, 0x16, 0x6d, 0x6f, + 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x62, 0x61, + 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x4d, 0x6f, 0x6e, + 0x67, 0x6f, 0x44, 0x42, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, + 0x70, 0x48, 0x00, 0x52, 0x14, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x52, 0x65, 0x73, 0x74, + 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x1a, 0x21, 0x0a, 0x05, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x6e, 0x0a, 0x0d, + 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x2c, 0x0a, + 0x12, 0x69, 0x73, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x65, 0x64, 0x5f, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x69, 0x73, 0x53, 0x68, 0x61, + 0x72, 0x64, 0x65, 0x64, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x2f, 0x0a, 0x08, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, + 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3e, 0x0a, 0x0b, + 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x2f, 0x0a, 0x08, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, + 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x14, 0x0a, 0x12, + 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, + 0x75, 0x70, 0x1a, 0x16, 0x0a, 0x14, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x52, 0x65, 0x73, + 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x42, 0x08, 0x0a, 0x06, 0x72, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x22, 0xa7, 0x03, 0x0a, 0x0b, 0x4a, 0x6f, 0x62, 0x50, 0x72, 0x6f, 0x67, + 0x72, 0x65, 0x73, 0x73, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x09, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 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, 0x09, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x43, 0x0a, 0x0c, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x62, + 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, + 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x0b, 0x6d, + 0x79, 0x73, 0x71, 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x59, 0x0a, 0x14, 0x6d, 0x79, + 0x73, 0x71, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b, + 0x75, 0x70, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x2e, 0x4a, 0x6f, 0x62, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x4d, 0x79, 0x53, + 0x51, 0x4c, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, + 0x00, 0x52, 0x12, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, + 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x2d, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x14, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x50, + 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x4c, 0x6f, 0x67, 0x73, 0x48, 0x00, 0x52, 0x04, + 0x6c, 0x6f, 0x67, 0x73, 0x1a, 0x0d, 0x0a, 0x0b, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x42, 0x61, 0x63, + 0x6b, 0x75, 0x70, 0x1a, 0x14, 0x0a, 0x12, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x52, 0x65, 0x73, 0x74, + 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x1a, 0x49, 0x0a, 0x04, 0x4c, 0x6f, 0x67, + 0x73, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x07, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, + 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, + 0x12, 0x12, 0x0a, 0x04, 0x64, 0x6f, 0x6e, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, + 0x64, 0x6f, 0x6e, 0x65, 0x42, 0x08, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x9d, + 0x04, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x09, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, + 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x2e, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x52, 0x09, 0x73, 0x6f, + 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x73, 0x1a, 0x08, 0x0a, 0x06, 0x4d, 0x79, 0x53, 0x51, 0x4c, + 0x64, 0x1a, 0x0c, 0x0a, 0x0a, 0x58, 0x74, 0x72, 0x61, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x1a, + 0x09, 0x0a, 0x07, 0x58, 0x62, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x1a, 0x08, 0x0a, 0x06, 0x51, 0x70, + 0x72, 0x65, 0x73, 0x73, 0x1a, 0x09, 0x0a, 0x07, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x1a, + 0x05, 0x0a, 0x03, 0x50, 0x42, 0x4d, 0x1a, 0x85, 0x03, 0x0a, 0x08, 0x53, 0x6f, 0x66, 0x74, 0x77, + 0x61, 0x72, 0x65, 0x12, 0x3a, 0x0a, 0x06, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, + 0x79, 0x53, 0x51, 0x4c, 0x64, 0x48, 0x00, 0x52, 0x06, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x12, + 0x46, 0x0a, 0x0a, 0x78, 0x74, 0x72, 0x61, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x58, + 0x74, 0x72, 0x61, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x0a, 0x78, 0x74, 0x72, + 0x61, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x3d, 0x0a, 0x07, 0x78, 0x62, 0x63, 0x6c, 0x6f, + 0x75, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x2e, 0x58, 0x62, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x48, 0x00, 0x52, 0x07, 0x78, + 0x62, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x12, 0x3a, 0x0a, 0x06, 0x71, 0x70, 0x72, 0x65, 0x73, 0x73, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x47, + 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x2e, 0x51, 0x70, 0x72, 0x65, 0x73, 0x73, 0x48, 0x00, 0x52, 0x06, 0x71, 0x70, 0x72, 0x65, + 0x73, 0x73, 0x12, 0x3b, 0x0a, 0x06, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x58, 0x62, - 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x48, 0x00, 0x52, 0x07, 0x78, 0x62, 0x63, 0x6c, 0x6f, 0x75, 0x64, - 0x12, 0x3a, 0x0a, 0x06, 0x71, 0x70, 0x72, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x20, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x51, 0x70, 0x72, 0x65, - 0x73, 0x73, 0x48, 0x00, 0x52, 0x06, 0x71, 0x70, 0x72, 0x65, 0x73, 0x73, 0x12, 0x3b, 0x0a, 0x06, - 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x6f, + 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x48, 0x00, 0x52, 0x06, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x12, + 0x31, 0x0a, 0x03, 0x70, 0x62, 0x6d, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x48, - 0x00, 0x52, 0x06, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x12, 0x31, 0x0a, 0x03, 0x70, 0x62, 0x6d, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x47, - 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x2e, 0x50, 0x42, 0x4d, 0x48, 0x00, 0x52, 0x03, 0x70, 0x62, 0x6d, 0x42, 0x0a, 0x0a, 0x08, - 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x22, 0x90, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x3e, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x1a, 0x39, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x76, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xfc, 0x08, 0x0a, 0x0c, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2b, 0x0a, 0x06, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0xff, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x21, 0x0a, 0x04, 0x70, 0x69, 0x6e, - 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, - 0x50, 0x69, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x04, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x41, 0x0a, 0x0d, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, - 0x00, 0x52, 0x0c, 0x73, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x12, - 0x3b, 0x0a, 0x0b, 0x71, 0x61, 0x6e, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x51, 0x41, 0x4e, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, - 0x52, 0x0a, 0x71, 0x61, 0x6e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x12, 0x41, 0x0a, 0x0d, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, - 0x00, 0x52, 0x0c, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, - 0x31, 0x0a, 0x0a, 0x6a, 0x6f, 0x62, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x10, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x52, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x48, 0x00, 0x52, 0x09, 0x6a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x12, 0x37, 0x0a, 0x0c, 0x6a, 0x6f, 0x62, 0x5f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, - 0x73, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x2e, 0x4a, 0x6f, 0x62, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x48, 0x00, 0x52, 0x0b, - 0x6a, 0x6f, 0x62, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x21, 0x0a, 0x04, 0x70, - 0x6f, 0x6e, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x2e, 0x50, 0x6f, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x04, 0x70, 0x6f, 0x6e, 0x67, 0x12, 0x36, - 0x0a, 0x09, 0x73, 0x65, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x74, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x08, 0x73, 0x65, - 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3f, 0x0a, 0x0c, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3c, 0x0a, 0x0b, 0x73, 0x74, 0x6f, 0x70, 0x5f, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x0a, 0x73, 0x74, 0x6f, 0x70, 0x41, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4b, 0x0a, 0x10, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x63, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1e, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, - 0x00, 0x52, 0x0f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x6a, 0x6f, 0x62, 0x18, - 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, - 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, - 0x52, 0x08, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x12, 0x33, 0x0a, 0x08, 0x73, 0x74, - 0x6f, 0x70, 0x5f, 0x6a, 0x6f, 0x62, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x07, 0x73, 0x74, 0x6f, 0x70, 0x4a, 0x6f, 0x62, 0x12, - 0x39, 0x0a, 0x0a, 0x6a, 0x6f, 0x62, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0f, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, - 0x09, 0x6a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3f, 0x0a, 0x0c, 0x67, 0x65, - 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x0b, - 0x67, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x46, 0x0a, 0x0f, 0x70, - 0x62, 0x6d, 0x5f, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x5f, 0x70, 0x69, 0x74, 0x72, 0x18, 0x13, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x42, 0x4d, - 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x50, 0x49, 0x54, 0x52, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x48, 0x00, 0x52, 0x0d, 0x70, 0x62, 0x6d, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x50, - 0x69, 0x74, 0x72, 0x12, 0x39, 0x0a, 0x0a, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x6c, 0x6f, 0x67, - 0x73, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x48, 0x00, 0x52, 0x09, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x3f, - 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x16, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x48, 0x00, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x42, - 0x09, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x89, 0x08, 0x0a, 0x0d, 0x53, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2b, 0x0a, 0x06, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0xff, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x21, 0x0a, 0x04, 0x70, 0x6f, 0x6e, - 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, - 0x50, 0x6f, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x04, 0x70, 0x6f, 0x6e, 0x67, 0x12, 0x42, 0x0a, 0x0d, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x48, 0x00, 0x52, 0x0c, 0x73, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, - 0x12, 0x3c, 0x0a, 0x0b, 0x71, 0x61, 0x6e, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x51, 0x41, - 0x4e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x48, 0x00, 0x52, 0x0a, 0x71, 0x61, 0x6e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x12, 0x42, - 0x0a, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x48, 0x00, 0x52, 0x0c, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x12, 0x21, 0x0a, 0x04, 0x70, 0x69, 0x6e, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x0b, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x48, 0x00, 0x52, - 0x04, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x35, 0x0a, 0x09, 0x73, 0x65, 0x74, 0x5f, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x2e, 0x53, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x48, 0x00, 0x52, 0x08, 0x73, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x0c, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x42, 0x4d, 0x48, 0x00, 0x52, 0x03, 0x70, + 0x62, 0x6d, 0x42, 0x0a, 0x0a, 0x08, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x22, 0x90, + 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x39, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x22, 0xfc, 0x08, 0x0a, 0x0c, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, + 0x69, 0x64, 0x12, 0x2b, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0xff, 0x0f, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, + 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, + 0x21, 0x0a, 0x04, 0x70, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x04, 0x70, 0x69, + 0x6e, 0x67, 0x12, 0x41, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0c, 0x73, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x64, 0x12, 0x3b, 0x0a, 0x0b, 0x71, 0x61, 0x6e, 0x5f, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x2e, 0x51, 0x41, 0x4e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0a, 0x71, 0x61, 0x6e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x12, 0x41, 0x0a, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0c, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x31, 0x0a, 0x0a, 0x6a, 0x6f, 0x62, 0x5f, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x48, 0x00, 0x52, 0x09, 0x6a, + 0x6f, 0x62, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x37, 0x0a, 0x0c, 0x6a, 0x6f, 0x62, 0x5f, + 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, + 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, + 0x73, 0x73, 0x48, 0x00, 0x52, 0x0b, 0x6a, 0x6f, 0x62, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, + 0x73, 0x12, 0x21, 0x0a, 0x04, 0x70, 0x6f, 0x6e, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x0b, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x6f, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x04, + 0x70, 0x6f, 0x6e, 0x67, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x65, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, + 0x53, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x48, 0x00, 0x52, 0x08, 0x73, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3f, 0x0a, 0x0c, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, - 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, - 0x0b, 0x73, 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3b, 0x0a, 0x0b, - 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x41, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0a, 0x73, - 0x74, 0x6f, 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4a, 0x0a, 0x10, 0x63, 0x68, 0x65, - 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x68, 0x65, 0x63, - 0x6b, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x48, 0x00, 0x52, 0x0f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x35, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x6a, - 0x6f, 0x62, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x48, 0x00, 0x52, 0x08, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x12, 0x32, 0x0a, 0x08, - 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x6a, 0x6f, 0x62, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, - 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x4a, 0x6f, 0x62, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x07, 0x73, 0x74, 0x6f, 0x70, 0x4a, 0x6f, 0x62, - 0x12, 0x38, 0x0a, 0x0a, 0x6a, 0x6f, 0x62, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0f, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, - 0x09, 0x6a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3e, 0x0a, 0x0c, 0x67, 0x65, - 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x19, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0b, 0x67, - 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x45, 0x0a, 0x0f, 0x70, 0x62, - 0x6d, 0x5f, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x5f, 0x70, 0x69, 0x74, 0x72, 0x18, 0x11, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x42, 0x4d, 0x53, - 0x77, 0x69, 0x74, 0x63, 0x68, 0x50, 0x49, 0x54, 0x52, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x48, 0x00, 0x52, 0x0d, 0x70, 0x62, 0x6d, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x50, 0x69, 0x74, - 0x72, 0x12, 0x38, 0x0a, 0x0a, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x6c, 0x6f, 0x67, 0x73, 0x18, - 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, - 0x52, 0x09, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x3e, 0x0a, 0x0c, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x14, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0b, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x09, 0x0a, 0x07, 0x70, - 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x2a, 0xc4, 0x01, 0x0a, 0x18, 0x4d, 0x79, 0x73, 0x71, 0x6c, - 0x45, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x6f, 0x72, - 0x6d, 0x61, 0x74, 0x12, 0x27, 0x0a, 0x23, 0x4d, 0x59, 0x53, 0x51, 0x4c, 0x5f, 0x45, 0x58, 0x50, - 0x4c, 0x41, 0x49, 0x4e, 0x5f, 0x4f, 0x55, 0x54, 0x50, 0x55, 0x54, 0x5f, 0x46, 0x4f, 0x52, 0x4d, - 0x41, 0x54, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x27, 0x0a, 0x23, - 0x4d, 0x59, 0x53, 0x51, 0x4c, 0x5f, 0x45, 0x58, 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x5f, 0x4f, 0x55, - 0x54, 0x50, 0x55, 0x54, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x5f, 0x44, 0x45, 0x46, 0x41, - 0x55, 0x4c, 0x54, 0x10, 0x01, 0x12, 0x24, 0x0a, 0x20, 0x4d, 0x59, 0x53, 0x51, 0x4c, 0x5f, 0x45, - 0x58, 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x5f, 0x4f, 0x55, 0x54, 0x50, 0x55, 0x54, 0x5f, 0x46, 0x4f, - 0x52, 0x4d, 0x41, 0x54, 0x5f, 0x4a, 0x53, 0x4f, 0x4e, 0x10, 0x02, 0x12, 0x30, 0x0a, 0x2c, 0x4d, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, + 0x52, 0x0b, 0x73, 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3c, 0x0a, + 0x0b, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x41, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, + 0x0a, 0x73, 0x74, 0x6f, 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4b, 0x0a, 0x10, 0x63, + 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x68, + 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x0f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x5f, 0x6a, 0x6f, 0x62, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x08, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, + 0x12, 0x33, 0x0a, 0x08, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x6a, 0x6f, 0x62, 0x18, 0x0e, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x4a, + 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x07, 0x73, 0x74, + 0x6f, 0x70, 0x4a, 0x6f, 0x62, 0x12, 0x39, 0x0a, 0x0a, 0x6a, 0x6f, 0x62, 0x5f, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x09, 0x6a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x3f, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x47, + 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x48, 0x00, 0x52, 0x0b, 0x67, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x46, 0x0a, 0x0f, 0x70, 0x62, 0x6d, 0x5f, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x5f, + 0x70, 0x69, 0x74, 0x72, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x2e, 0x50, 0x42, 0x4d, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x50, 0x49, 0x54, 0x52, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x0d, 0x70, 0x62, 0x6d, 0x53, + 0x77, 0x69, 0x74, 0x63, 0x68, 0x50, 0x69, 0x74, 0x72, 0x12, 0x39, 0x0a, 0x0a, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x5f, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x09, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x3f, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, + 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x09, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, + 0x22, 0x89, 0x08, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, + 0x69, 0x64, 0x12, 0x2b, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0xff, 0x0f, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, + 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, + 0x21, 0x0a, 0x04, 0x70, 0x6f, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x6f, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x04, 0x70, 0x6f, + 0x6e, 0x67, 0x12, 0x42, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x0c, 0x73, 0x74, 0x61, 0x74, 0x65, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x12, 0x3c, 0x0a, 0x0b, 0x71, 0x61, 0x6e, 0x5f, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x2e, 0x51, 0x41, 0x4e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x0a, 0x71, 0x61, 0x6e, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x12, 0x42, 0x0a, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x0c, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x21, 0x0a, 0x04, 0x70, 0x69, 0x6e, 0x67, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x50, + 0x69, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x04, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x35, 0x0a, 0x09, 0x73, + 0x65, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, + 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x08, 0x73, 0x65, 0x74, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x0c, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x3b, 0x0a, 0x0b, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, + 0x53, 0x74, 0x6f, 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x48, 0x00, 0x52, 0x0a, 0x73, 0x74, 0x6f, 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x4a, 0x0a, 0x10, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0f, 0x63, 0x68, 0x65, 0x63, + 0x6b, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x35, 0x0a, 0x09, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x5f, 0x6a, 0x6f, 0x62, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, + 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x08, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4a, + 0x6f, 0x62, 0x12, 0x32, 0x0a, 0x08, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x6a, 0x6f, 0x62, 0x18, 0x0e, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x6f, + 0x70, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x07, 0x73, + 0x74, 0x6f, 0x70, 0x4a, 0x6f, 0x62, 0x12, 0x38, 0x0a, 0x0a, 0x6a, 0x6f, 0x62, 0x5f, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x09, 0x6a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x3e, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x47, + 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x48, 0x00, 0x52, 0x0b, 0x67, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0x45, 0x0a, 0x0f, 0x70, 0x62, 0x6d, 0x5f, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x5f, 0x70, + 0x69, 0x74, 0x72, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x2e, 0x50, 0x42, 0x4d, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x50, 0x49, 0x54, 0x52, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0d, 0x70, 0x62, 0x6d, 0x53, 0x77, 0x69, + 0x74, 0x63, 0x68, 0x50, 0x69, 0x74, 0x72, 0x12, 0x38, 0x0a, 0x0a, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x5f, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x09, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, + 0x73, 0x12, 0x3e, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x66, + 0x6f, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, + 0x6f, 0x42, 0x09, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x2a, 0xc4, 0x01, 0x0a, + 0x18, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x45, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x4f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x27, 0x0a, 0x23, 0x4d, 0x59, 0x53, + 0x51, 0x4c, 0x5f, 0x45, 0x58, 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x5f, 0x4f, 0x55, 0x54, 0x50, 0x55, + 0x54, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, + 0x10, 0x00, 0x12, 0x27, 0x0a, 0x23, 0x4d, 0x59, 0x53, 0x51, 0x4c, 0x5f, 0x45, 0x58, 0x50, 0x4c, + 0x41, 0x49, 0x4e, 0x5f, 0x4f, 0x55, 0x54, 0x50, 0x55, 0x54, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, + 0x54, 0x5f, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x10, 0x01, 0x12, 0x24, 0x0a, 0x20, 0x4d, 0x59, 0x53, 0x51, 0x4c, 0x5f, 0x45, 0x58, 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x5f, 0x4f, 0x55, 0x54, - 0x50, 0x55, 0x54, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x5f, 0x54, 0x52, 0x41, 0x44, 0x49, - 0x54, 0x49, 0x4f, 0x4e, 0x41, 0x4c, 0x5f, 0x4a, 0x53, 0x4f, 0x4e, 0x10, 0x03, 0x32, 0x41, 0x0a, - 0x05, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x12, 0x13, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x14, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x28, 0x01, 0x30, 0x01, - 0x42, 0x6f, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x42, 0x0a, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x22, 0x67, 0x69, 0x74, - 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x65, 0x72, 0x63, 0x6f, 0x6e, 0x61, 0x2f, - 0x70, 0x6d, 0x6d, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x70, 0x62, 0xa2, - 0x02, 0x03, 0x41, 0x58, 0x58, 0xaa, 0x02, 0x05, 0x41, 0x67, 0x65, 0x6e, 0x74, 0xca, 0x02, 0x05, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0xe2, 0x02, 0x11, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x5c, 0x47, 0x50, - 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x05, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x50, 0x55, 0x54, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x5f, 0x4a, 0x53, 0x4f, 0x4e, 0x10, + 0x02, 0x12, 0x30, 0x0a, 0x2c, 0x4d, 0x59, 0x53, 0x51, 0x4c, 0x5f, 0x45, 0x58, 0x50, 0x4c, 0x41, + 0x49, 0x4e, 0x5f, 0x4f, 0x55, 0x54, 0x50, 0x55, 0x54, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, + 0x5f, 0x54, 0x52, 0x41, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x41, 0x4c, 0x5f, 0x4a, 0x53, 0x4f, + 0x4e, 0x10, 0x03, 0x32, 0x41, 0x0a, 0x05, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x07, + 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x12, 0x13, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, + 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x14, 0x2e, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x28, 0x01, 0x30, 0x01, 0x42, 0x6f, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x42, 0x0a, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, + 0x01, 0x5a, 0x22, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x65, + 0x72, 0x63, 0x6f, 0x6e, 0x61, 0x2f, 0x70, 0x6d, 0x6d, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0xa2, 0x02, 0x03, 0x41, 0x58, 0x58, 0xaa, 0x02, 0x05, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0xca, 0x02, 0x05, 0x41, 0x67, 0x65, 0x6e, 0x74, 0xe2, 0x02, 0x11, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, + 0x02, 0x05, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/api/agentpb/agent.pb.validate.go b/api/agentpb/agent.pb.validate.go index 069d003037..ea4507ce88 100644 --- a/api/agentpb/agent.pb.validate.go +++ b/api/agentpb/agent.pb.validate.go @@ -11249,8 +11249,6 @@ func (m *CheckConnectionResponse_Stats) validate(all bool) error { // no validation rules for TableCount - // no validation rules for Version - if len(errors) > 0 { return CheckConnectionResponse_StatsMultiError(errors) } diff --git a/api/agentpb/agent.proto b/api/agentpb/agent.proto index 2d991cff99..e03d76109e 100644 --- a/api/agentpb/agent.proto +++ b/api/agentpb/agent.proto @@ -444,7 +444,6 @@ message CheckConnectionResponse { message Stats { // A number of tables, 0 if unknown. int32 table_count = 1; - string version = 2; } // Error message if connection check failed. string error = 1; From 156fda71cd950b718a26b35a3a9e4e7a85ff0d68 Mon Sep 17 00:00:00 2001 From: Alex Tymchuk Date: Wed, 20 Sep 2023 15:19:23 +0000 Subject: [PATCH 11/41] PMM-12375 add message type processing to channel --- agent/client/channel/channel.go | 5 ++++ managed/cmd/pmm-managed/main.go | 50 +++++++++++++++++---------------- 2 files changed, 31 insertions(+), 24 deletions(-) diff --git a/agent/client/channel/channel.go b/agent/client/channel/channel.go index ce272b2e35..62e71d1d7f 100644 --- a/agent/client/channel/channel.go +++ b/agent/client/channel/channel.go @@ -290,6 +290,11 @@ func (c *Channel) runReceiver() { ID: msg.Id, Payload: p.AgentLogs, } + case *agentpb.ServerMessage_ServiceInfo: + c.requests <- &ServerRequest{ + ID: msg.Id, + Payload: p.ServiceInfo, + } // responses case *agentpb.ServerMessage_Pong: diff --git a/managed/cmd/pmm-managed/main.go b/managed/cmd/pmm-managed/main.go index 1e8e07e8c6..2f7ecdc3bc 100644 --- a/managed/cmd/pmm-managed/main.go +++ b/managed/cmd/pmm-managed/main.go @@ -850,6 +850,7 @@ func main() { //nolint:cyclop,maintidx prom.MustRegister(inventoryMetricsCollector) connectionCheck := agents.NewConnectionChecker(agentsRegistry) + serviceInfoBroker := agents.NewServiceInfoBroker(agentsRegistry) alertManager := alertmanager.New(db) // Alertmanager is special due to being added to PMM with invalid /etc/alertmanager.yml. @@ -1104,41 +1105,42 @@ func main() { //nolint:cyclop,maintidx defer wg.Done() runGRPCServer(ctx, &gRPCServerDeps{ - db: db, - vmdb: vmdb, - platformClient: platformClient, - server: server, - agentsRegistry: agentsRegistry, - handler: agentsHandler, actions: actionsService, + agentService: agentService, + agentsRegistry: agentsRegistry, agentsStateUpdater: agentsStateUpdater, - connectionCheck: connectionCheck, - grafanaClient: grafanaClient, - checksService: checksService, - dbaasClient: dbaasClient, alertmanager: alertManager, - vmalert: vmalert, - settings: settings, alertsService: alertsService, - templatesService: templatesService, - rulesService: rulesService, - jobsService: jobsService, - versionServiceClient: versionService, - schedulerService: schedulerService, + backupRemovalService: backupRemovalService, backupService: backupService, + checksService: checksService, compatibilityService: compatibilityService, - backupRemovalService: backupRemovalService, - pbmPITRService: pbmPITRService, - minioClient: minioClient, - versionCache: versionCache, - supervisord: supervisord, - config: &cfg.Config, componentsService: componentsService, + config: &cfg.Config, + connectionCheck: connectionCheck, + db: db, + dbaasClient: dbaasClient, dbaasInitializer: dbaasInitializer, - agentService: agentService, + grafanaClient: grafanaClient, + handler: agentsHandler, + jobsService: jobsService, kubeStorage: kubeStorage, + minioClient: minioClient, + pbmPITRService: pbmPITRService, + platformClient: platformClient, + rulesService: rulesService, + schedulerService: schedulerService, + server: server, + serviceInfoBroker: serviceInfoBroker, + settings: settings, + supervisord: supervisord, + templatesService: templatesService, uieventsService: uieventsService, + versionCache: versionCache, + versionServiceClient: versionService, + vmalert: vmalert, vmClient: &vmClient, + vmdb: vmdb, }) }() From d154c047a3249d355c5ac47a19feafd83e8810d2 Mon Sep 17 00:00:00 2001 From: Alex Tymchuk Date: Wed, 20 Sep 2023 15:19:41 +0000 Subject: [PATCH 12/41] PMM-12375 update codeowners --- .github/CODEOWNERS | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 71e4fab6ff..68d20180a2 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,16 +1,11 @@ * @percona/pmm-review-be -/build/ @atymchuk @percona/pmm-review-be -/admin/ @percona/pmm-review-be /agent/agents/postgres/ @JiriCtvrtka @percona/pmm-review-be /agent/runner/ @artemgavrilov @percona/pmm-review-be /api/ @BupycHuk @percona/pmm-review-be -/docs/api/ @atymchuk @percona/pmm-review-be /managed/services/checks/ @idoqo @percona/pmm-review-be -/managed/ @percona/pmm-review-be /managed/services/dbaas @gen1us2k @recharte @percona/pmm-review-be /managed/services/management/dbaas @gen1us2k @recharte @percona/pmm-review-be /update/ @BupycHuk @talhabinrizwan @percona/pmm-review-be -/api-tests/ @percona/pmm-review-be **/go.mod @percona/pmm-review-dependency @percona/pmm-review-be **/Dockerfile @percona/pmm-review-dependency @percona/pmm-review-be /cli-tests/package.json @percona/pmm-review-dependency @yurkovychv From 8ee6e764f673ca5304661c4b3e02b164bea7f732 Mon Sep 17 00:00:00 2001 From: Alex Tymchuk Date: Wed, 20 Sep 2023 15:23:40 +0000 Subject: [PATCH 13/41] PMM-12375 respect skipConnectionCheck, simpler schema --- managed/models/database.go | 3 +-- managed/services/management/mysql.go | 11 +++++------ 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/managed/models/database.go b/managed/models/database.go index 9aeda6c39a..1390acc5b1 100644 --- a/managed/models/database.go +++ b/managed/models/database.go @@ -919,8 +919,7 @@ var databaseSchema = [][]string{ `UPDATE services SET cluster = service_name WHERE cluster = ''`, }, 86: { - `ALTER TABLE services - ADD COLUMN version VARCHAR NOT NULL DEFAULT ''`, + `ALTER TABLE services ADD COLUMN version VARCHAR`, }, } diff --git a/managed/services/management/mysql.go b/managed/services/management/mysql.go index b31311751f..ca3f5c74c2 100644 --- a/managed/services/management/mysql.go +++ b/managed/services/management/mysql.go @@ -127,13 +127,12 @@ func (s *MySQLService) Add(ctx context.Context, req *managementpb.AddMySQLReques if err = s.cc.CheckConnectionToService(ctx, tx.Querier, service, row); err != nil { return err } - } - - if err = s.sib.GetInfoFromService(ctx, tx.Querier, service, row); err != nil { - // GetInfoFromService updates the table count in row so, let's also update the response - res.TableCount = *row.TableCount - return err + if err = s.sib.GetInfoFromService(ctx, tx.Querier, service, row); err != nil { + // GetInfoFromService updates the table count in row so, let's also update the response + res.TableCount = *row.TableCount + return err + } } agent, err := services.ToAPIAgent(tx.Querier, row) From 791f97c96737e0bd2ef93201c6c973c748a3905d Mon Sep 17 00:00:00 2001 From: Alex Tymchuk Date: Wed, 20 Sep 2023 15:54:30 +0000 Subject: [PATCH 14/41] PMM-12375 fix linter warnings --- .golangci.yml | 2 ++ agent/runner/jobs/pbm_helpers.go | 2 +- agent/serviceinfobroker/service_info_broker.go | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index cd8d9720fe..14c7733058 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -103,10 +103,12 @@ linters: - maligned # deprecated - nlreturn # too annoying - nosnakecase # deprecated + - rowserrcheck # disabled because of generics - scopelint # too many false positives - structcheck # replaced by unused - varcheck # replaced by unused - varnamelen # useless + - wastedassign # disabled because of generics - wrapcheck # we do not use wrapping everywhere - wsl # too annoying diff --git a/agent/runner/jobs/pbm_helpers.go b/agent/runner/jobs/pbm_helpers.go index b8f5777c8b..ff87858da2 100644 --- a/agent/runner/jobs/pbm_helpers.go +++ b/agent/runner/jobs/pbm_helpers.go @@ -279,7 +279,7 @@ func waitForPBMBackup(ctx context.Context, l logrus.FieldLogger, dbURL *string, return nil case "canceled": return errors.New("backup was canceled") - case "error": //nolint:goconst + case "error": return errors.New(info.Error) } diff --git a/agent/serviceinfobroker/service_info_broker.go b/agent/serviceinfobroker/service_info_broker.go index d22bcd5b9a..1b2c7819fe 100644 --- a/agent/serviceinfobroker/service_info_broker.go +++ b/agent/serviceinfobroker/service_info_broker.go @@ -83,7 +83,7 @@ func (sib *ServiceInfoBroker) GetInfoFromService(ctx context.Context, msg *agent } } -func (sib *ServiceInfoBroker) getMySQLInfo(ctx context.Context, dsn string, files *agentpb.TextFiles, id uint32) *agentpb.ServiceInfoResponse { //nolint:lll +func (sib *ServiceInfoBroker) getMySQLInfo(ctx context.Context, dsn string, files *agentpb.TextFiles, id uint32) *agentpb.ServiceInfoResponse { var res agentpb.ServiceInfoResponse var err error From 9c3de41fc3c51e83c6a40f121ae1ee8497e90a85 Mon Sep 17 00:00:00 2001 From: Alex Tymchuk Date: Wed, 20 Sep 2023 16:14:09 +0000 Subject: [PATCH 15/41] PMM-12375 fix license headers --- agent/serviceinfobroker/service_info_broker.go | 2 +- agent/serviceinfobroker/service_info_broker_test.go | 2 +- managed/services/agents/service_info_broker.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/agent/serviceinfobroker/service_info_broker.go b/agent/serviceinfobroker/service_info_broker.go index 1b2c7819fe..656610527f 100644 --- a/agent/serviceinfobroker/service_info_broker.go +++ b/agent/serviceinfobroker/service_info_broker.go @@ -1,4 +1,4 @@ -// Copyright 2019 Percona LLC +// Copyright 2023 Percona LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/agent/serviceinfobroker/service_info_broker_test.go b/agent/serviceinfobroker/service_info_broker_test.go index 61b3efb0b4..6ff08b17b4 100644 --- a/agent/serviceinfobroker/service_info_broker_test.go +++ b/agent/serviceinfobroker/service_info_broker_test.go @@ -1,4 +1,4 @@ -// Copyright 2019 Percona LLC +// Copyright 2023 Percona LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/managed/services/agents/service_info_broker.go b/managed/services/agents/service_info_broker.go index 4223365a7f..de44fe170a 100644 --- a/managed/services/agents/service_info_broker.go +++ b/managed/services/agents/service_info_broker.go @@ -1,4 +1,4 @@ -// Copyright (C) 2017 Percona LLC +// Copyright (C) 2023 Percona LLC // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as published by From 09db06810acd4db987c30537349c40c2ed1166d8 Mon Sep 17 00:00:00 2001 From: Alex Tymchuk Date: Thu, 21 Sep 2023 12:15:45 +0000 Subject: [PATCH 16/41] PMM-12375 respect skipConnectionCheck param --- managed/services/inventory/agents.go | 24 +++++++++++------------ managed/services/management/mongodb.go | 6 +++--- managed/services/management/postgresql.go | 6 +++--- managed/services/management/proxysql.go | 6 +++--- 4 files changed, 21 insertions(+), 21 deletions(-) diff --git a/managed/services/inventory/agents.go b/managed/services/inventory/agents.go index c70b67e941..271ab0acac 100644 --- a/managed/services/inventory/agents.go +++ b/managed/services/inventory/agents.go @@ -271,10 +271,10 @@ func (as *AgentsService) AddMySQLdExporter(ctx context.Context, req *inventorypb if err = as.cc.CheckConnectionToService(ctx, tx.Querier, service, row); err != nil { return err } - } - if err = as.sib.GetInfoFromService(ctx, tx.Querier, service, row); err != nil { - return err + if err = as.sib.GetInfoFromService(ctx, tx.Querier, service, row); err != nil { + return err + } } agent, err := services.ToAPIAgent(tx.Querier, row) @@ -336,10 +336,10 @@ func (as *AgentsService) AddMongoDBExporter(ctx context.Context, req *inventoryp if err = as.cc.CheckConnectionToService(ctx, tx.Querier, service, row); err != nil { return err } - } - if err = as.sib.GetInfoFromService(ctx, tx.Querier, service, row); err != nil { - return err + if err = as.sib.GetInfoFromService(ctx, tx.Querier, service, row); err != nil { + return err + } } agent, err := services.ToAPIAgent(tx.Querier, row) @@ -530,10 +530,10 @@ func (as *AgentsService) AddPostgresExporter(ctx context.Context, req *inventory if err = as.cc.CheckConnectionToService(ctx, tx.Querier, service, row); err != nil { return err } - } - if err = as.sib.GetInfoFromService(ctx, tx.Querier, service, row); err != nil { - return err + if err = as.sib.GetInfoFromService(ctx, tx.Querier, service, row); err != nil { + return err + } } agent, err := services.ToAPIAgent(tx.Querier, row) @@ -658,10 +658,10 @@ func (as *AgentsService) AddProxySQLExporter(ctx context.Context, req *inventory if err = as.cc.CheckConnectionToService(ctx, tx.Querier, service, row); err != nil { return err } - } - if err = as.sib.GetInfoFromService(ctx, tx.Querier, service, row); err != nil { - return err + if err = as.sib.GetInfoFromService(ctx, tx.Querier, service, row); err != nil { + return err + } } agent, err := services.ToAPIAgent(tx.Querier, row) diff --git a/managed/services/management/mongodb.go b/managed/services/management/mongodb.go index 3020c14a2a..450b526fd4 100644 --- a/managed/services/management/mongodb.go +++ b/managed/services/management/mongodb.go @@ -105,10 +105,10 @@ func (s *MongoDBService) Add(ctx context.Context, req *managementpb.AddMongoDBRe if err = s.cc.CheckConnectionToService(ctx, tx.Querier, service, row); err != nil { return err } - } - if err = s.sib.GetInfoFromService(ctx, tx.Querier, service, row); err != nil { - return err + if err = s.sib.GetInfoFromService(ctx, tx.Querier, service, row); err != nil { + return err + } } agent, err := services.ToAPIAgent(tx.Querier, row) diff --git a/managed/services/management/postgresql.go b/managed/services/management/postgresql.go index 910bc34cdc..33e7c002ef 100644 --- a/managed/services/management/postgresql.go +++ b/managed/services/management/postgresql.go @@ -103,10 +103,10 @@ func (s *PostgreSQLService) Add(ctx context.Context, req *managementpb.AddPostgr if err = s.cc.CheckConnectionToService(ctx, tx.Querier, service, row); err != nil { return err } - } - if err = s.sib.GetInfoFromService(ctx, tx.Querier, service, row); err != nil { - return err + if err = s.sib.GetInfoFromService(ctx, tx.Querier, service, row); err != nil { + return err + } } agent, err := services.ToAPIAgent(tx.Querier, row) diff --git a/managed/services/management/proxysql.go b/managed/services/management/proxysql.go index 2c89d32216..b6809c925a 100644 --- a/managed/services/management/proxysql.go +++ b/managed/services/management/proxysql.go @@ -100,10 +100,10 @@ func (s *ProxySQLService) Add(ctx context.Context, req *managementpb.AddProxySQL if err = s.cc.CheckConnectionToService(ctx, tx.Querier, service, row); err != nil { return err } - } - if err = s.sib.GetInfoFromService(ctx, tx.Querier, service, row); err != nil { - return err + if err = s.sib.GetInfoFromService(ctx, tx.Querier, service, row); err != nil { + return err + } } agent, err := services.ToAPIAgent(tx.Querier, row) From c1ccea2407222d0b0e8a23d43059241e3ee06f6f Mon Sep 17 00:00:00 2001 From: Alex Tymchuk Date: Fri, 22 Sep 2023 08:32:13 +0000 Subject: [PATCH 17/41] PMM-12375 minor fixes --- managed/services/management/grpc/mysql_server.go | 2 +- managed/services/management/mysql.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/managed/services/management/grpc/mysql_server.go b/managed/services/management/grpc/mysql_server.go index 43048d48cc..6753a6c4db 100644 --- a/managed/services/management/grpc/mysql_server.go +++ b/managed/services/management/grpc/mysql_server.go @@ -22,7 +22,7 @@ import ( "github.com/percona/pmm/managed/services/management" ) -// TODO merge into ../mysql.go +// TODO merge into ../mysql.go. type mySQLServer struct { svc *management.MySQLService diff --git a/managed/services/management/mysql.go b/managed/services/management/mysql.go index dc4aafc697..ac9292fac2 100644 --- a/managed/services/management/mysql.go +++ b/managed/services/management/mysql.go @@ -129,10 +129,10 @@ func (s *MySQLService) Add(ctx context.Context, req *managementpb.AddMySQLReques } if err = s.sib.GetInfoFromService(ctx, tx.Querier, service, row); err != nil { - // GetInfoFromService updates the table count in row so, let's also update the response - res.TableCount = *row.TableCount return err } + // GetInfoFromService updates the table count in row so, let's also update the response + res.TableCount = *row.TableCount } agent, err := services.ToAPIAgent(tx.Querier, row) From 94dea4f3c317d6dfb98fb98521f0926259a22c41 Mon Sep 17 00:00:00 2001 From: Alex Tymchuk Date: Fri, 22 Sep 2023 15:43:09 +0000 Subject: [PATCH 18/41] PMM-12375 update the docs --- CONTRIBUTING.md | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 6efdba02c2..b629c4234c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -4,9 +4,9 @@ We'd be glad to welcome you to Percona community which tries to keep the open so ## Table of contents 1. [Project repos structure](#Project-repos-structure) -2. [API documentation](#API-documentation) +2. [API documentation](#API-Reference-Documentation) 3. [Prerequisites](#Prerequisites) -4. [Submitting a Bug](#Submitting-a-Bug) +4. [Submitting a bug](#Submitting-a-Bug) 5. [Setup your local development environment](#Setup-your-local-development-environment) 6. [Tests](#Tests) 7. [Feature Build](#Feature-Build) @@ -202,19 +202,22 @@ There are number of approaches for the code review and ownership: Code Ownership For more efficient review process we use a mixed approach: * repos that have CODEOWNERS - * add **auto-review-team** additionally to CODEOWNERS assigned + * github will assign reviewers automatically * repos that don't have CODEOWNERS - * add **auto-review-team** + * add reviewers as follows: + * add `pmm-review-fe` for UI/UX reviews + * add `pmm-review-exporters` for exporter reviews [see PMM Client](#PMM-Client) + * add `pmm-review-be` for backend reviews * if you know exactly who should review your code - * add ppl to the review + * add them to the review -| Team | Description | Members | -| -------------------- | ----------------------------------------------------------------------- | ------- | -| pmm-review-fe | ppl for UI/UX reviews for [FrontEnd repos](#FrontEnd) | [FE team](https://github.com/orgs/percona/teams/pmm-review-fe/members) | -| pmm-review-exporters | reviewers for all exporters [see PMM Client](#PMM-Client) | [Exporters team](https://github.com/orgs/percona/teams/pmm-review-exporters/members) | -| pmm-review-be | Back-End engineers | [BE team](https://github.com/orgs/percona/teams/pmm-review-be/members) | -| PMM Admins | ppl that could use admins rights to force merge or change repo settings | [PMM Admin team](https://github.com/orgs/percona/teams/pmm-admins/members) | +| Team | Description | Members | +| -------------------- | -------------------------------------------------------------- | ------- | +| pmm-review-fe | UI reviewers of PRs to [FrontEnd repos](#FrontEnd) | [FE team](https://github.com/orgs/percona/teams/pmm-review-fe/members) | +| pmm-review-exporters | exporter reviewers of PRs to [PMM Client](#PMM-Client) | [Exporters team](https://github.com/orgs/percona/teams/pmm-review-exporters/members) | +| pmm-review-be | reviewers of backend (Go) PRs | [BE team](https://github.com/orgs/percona/teams/pmm-review-be/members) | +| PMM Admins | reviewers that could use admins rights to force merge or change repo settings | [PMM Admin team](https://github.com/orgs/percona/teams/pmm-admins/members) | ## After your Pull Request is merged From e17d889e8981fcff8525a52821894ce895c94837 Mon Sep 17 00:00:00 2001 From: Alex Tymchuk Date: Fri, 22 Sep 2023 19:45:54 +0000 Subject: [PATCH 19/41] PMM-12375 do not run serviceInfo for older clients --- .../serviceinfobroker/service_info_broker.go | 9 +-- .../services/agents/service_info_broker.go | 59 ++++++++++++++----- 2 files changed, 47 insertions(+), 21 deletions(-) diff --git a/agent/serviceinfobroker/service_info_broker.go b/agent/serviceinfobroker/service_info_broker.go index 656610527f..c336313910 100644 --- a/agent/serviceinfobroker/service_info_broker.go +++ b/agent/serviceinfobroker/service_info_broker.go @@ -127,9 +127,9 @@ func (sib *ServiceInfoBroker) getMySQLInfo(ctx context.Context, dsn string, file return &res } - tableCount := int32(count) + res.TableCount = int32(count) if count > math.MaxInt32 { - tableCount = math.MaxInt32 + res.TableCount = math.MaxInt32 } var version string @@ -138,9 +138,7 @@ func (sib *ServiceInfoBroker) getMySQLInfo(ctx context.Context, dsn string, file return &res } - res.TableCount = tableCount res.Version = version - return &res } @@ -200,7 +198,6 @@ func (sib *ServiceInfoBroker) getMongoDBInfo(ctx context.Context, dsn string, fi } res.Version = buildInfo.Version - return &res } @@ -231,7 +228,6 @@ func (sib *ServiceInfoBroker) getPostgreSQLInfo(ctx context.Context, dsn string, } res.Version = version - return &res } @@ -259,6 +255,5 @@ func (sib *ServiceInfoBroker) getProxySQLInfo(ctx context.Context, dsn string) * } res.Version = version - return &res } diff --git a/managed/services/agents/service_info_broker.go b/managed/services/agents/service_info_broker.go index de44fe170a..f8529c17a8 100644 --- a/managed/services/agents/service_info_broker.go +++ b/managed/services/agents/service_info_broker.go @@ -32,6 +32,7 @@ import ( "github.com/percona/pmm/api/inventorypb" "github.com/percona/pmm/managed/models" "github.com/percona/pmm/utils/logger" + "github.com/percona/pmm/version" ) // ServiceInfoBroker checks if connection can be established to service. @@ -140,6 +141,18 @@ func (c *ServiceInfoBroker) GetInfoFromService(ctx context.Context, q *reform.Qu pmmAgentID = models.PMMServerAgentID } + // Skip check connection to external exporter with old pmm-agent. + if service.ServiceType == models.ExternalServiceType || service.ServiceType == models.HAProxyServiceType { + isSupported, err := isExternalExporterServiceInfoSupported(q, pmmAgentID) + if err != nil { + return err + } + + if !isSupported { + return nil + } + } + pmmAgent, err := c.r.get(pmmAgentID) if err != nil { return err @@ -155,24 +168,35 @@ func (c *ServiceInfoBroker) GetInfoFromService(ctx context.Context, q *reform.Qu sanitizedDSN = strings.ReplaceAll(request.Dsn, word, "****") } l.Infof("ServiceInfoRequest: type: %s, DSN: %s timeout: %s.", request.Type, sanitizedDSN, request.Timeout) + resp, err := pmmAgent.channel.SendAndWaitResponse(request) if err != nil { return err } l.Infof("ServiceInfo response: %+v.", resp) + sInfo, ok := resp.(*agentpb.ServiceInfoResponse) + if !ok { + return errors.New("failed to cast response to *agentpb.ServiceInfoResponse") + } + + msg := sInfo.Error + if msg == context.Canceled.Error() || msg == context.DeadlineExceeded.Error() { + msg = fmt.Sprintf("timeout (%s)", msg) + return status.Error(codes.FailedPrecondition, fmt.Sprintf("Connection check failed: %s.", msg)) + } + stype := service.ServiceType switch stype { case models.MySQLServiceType: - stats := resp.(*agentpb.ServiceInfoResponse) //nolint:forcetypeassert - tableCount := stats.GetTableCount() - agent.TableCount = &tableCount - l.Debugf("Updating table count: %d.", tableCount) + agent.TableCount = &sInfo.TableCount + l.Debugf("Updating table count: %d.", sInfo.TableCount) if err = q.Update(agent); err != nil { return errors.Wrap(err, "failed to update table count") } return updateServiceVersion(ctx, q, resp, service) case models.ExternalServiceType, models.HAProxyServiceType: + return nil case models.PostgreSQLServiceType: return updateServiceVersion(ctx, q, resp, service) case models.MongoDBServiceType: @@ -182,21 +206,12 @@ func (c *ServiceInfoBroker) GetInfoFromService(ctx context.Context, q *reform.Qu default: return errors.Errorf("unhandled Service type %s", service.ServiceType) } - - msg := resp.(*agentpb.ServiceInfoResponse).Error //nolint:forcetypeassert - switch msg { - case "": - return nil - case context.Canceled.Error(), context.DeadlineExceeded.Error(): - msg = fmt.Sprintf("timeout (%s)", msg) - } - return status.Error(codes.FailedPrecondition, fmt.Sprintf("Connection check failed: %s.", msg)) } func updateServiceVersion(ctx context.Context, q *reform.Querier, resp agentpb.AgentResponsePayload, service *models.Service) error { l := logger.Get(ctx) - version := resp.(*agentpb.ServiceInfoResponse).GetVersion() //nolint:forcetypeassert + version := resp.(*agentpb.ServiceInfoResponse).Version //nolint:forcetypeassert if version == "" { return nil } @@ -209,3 +224,19 @@ func updateServiceVersion(ctx context.Context, q *reform.Querier, resp agentpb.A return nil } + +func isExternalExporterServiceInfoSupported(q *reform.Querier, pmmAgentID string) (bool, error) { + pmmAgent, err := models.FindAgentByID(q, pmmAgentID) + if err != nil { + return false, fmt.Errorf("failed to get PMM Agent: %w", err) + } + pmmAgentVersion, err := version.Parse(*pmmAgent.Version) + if err != nil { + return false, fmt.Errorf("failed to parse PMM agent version %q: %w", *pmmAgent.Version, err) + } + + if pmmAgentVersion.Less(checkExternalExporterConnectionPMMVersion) { + return false, nil + } + return true, nil +} From d842adcb95b885dd5967451186cf06b772fb3fb4 Mon Sep 17 00:00:00 2001 From: Alex Tymchuk Date: Fri, 22 Sep 2023 23:47:15 +0000 Subject: [PATCH 20/41] PMM-12375 add serviceInfoBroker to rds --- .../serviceinfobroker/service_info_broker.go | 3 -- managed/cmd/pmm-managed/main.go | 2 +- .../services/agents/service_info_broker.go | 2 +- managed/services/management/deps.go | 1 + .../mock_service_info_broker_test.go | 46 +++++++++++++++++++ managed/services/management/rds.go | 12 ++++- managed/services/management/rds_test.go | 4 +- 7 files changed, 62 insertions(+), 8 deletions(-) create mode 100644 managed/services/management/mock_service_info_broker_test.go diff --git a/agent/serviceinfobroker/service_info_broker.go b/agent/serviceinfobroker/service_info_broker.go index c336313910..2dca353cf0 100644 --- a/agent/serviceinfobroker/service_info_broker.go +++ b/agent/serviceinfobroker/service_info_broker.go @@ -135,7 +135,6 @@ func (sib *ServiceInfoBroker) getMySQLInfo(ctx context.Context, dsn string, file var version string if err = db.QueryRowContext(ctx, "SELECT /* agent='serviceinfobroker' */ VERSION()").Scan(&version); err != nil { res.Error = err.Error() - return &res } res.Version = version @@ -194,7 +193,6 @@ func (sib *ServiceInfoBroker) getMongoDBInfo(ctx context.Context, dsn string, fi if err = resp.Decode(&buildInfo); err != nil { sib.l.Debugf("getMongoDBInfo: failed to decode buildInfo: %s", err) - return &res } res.Version = buildInfo.Version @@ -224,7 +222,6 @@ func (sib *ServiceInfoBroker) getPostgreSQLInfo(ctx context.Context, dsn string, var version string if err = db.QueryRowContext(ctx, "SHOW /* agent='serviceinfobroker' */ SERVER_VERSION").Scan(&version); err != nil { res.Error = err.Error() - return &res } res.Version = version diff --git a/managed/cmd/pmm-managed/main.go b/managed/cmd/pmm-managed/main.go index a229c156cf..ba37114898 100644 --- a/managed/cmd/pmm-managed/main.go +++ b/managed/cmd/pmm-managed/main.go @@ -289,7 +289,7 @@ func runGRPCServer(ctx context.Context, deps *gRPCServerDeps) { managementpb.RegisterPostgreSQLServer(gRPCServer, managementgrpc.NewManagementPostgreSQLServer(postgresqlSvc)) managementpb.RegisterProxySQLServer(gRPCServer, managementgrpc.NewManagementProxySQLServer(proxysqlSvc)) managementpb.RegisterActionsServer(gRPCServer, managementgrpc.NewActionsServer(deps.actions, deps.db)) - managementpb.RegisterRDSServer(gRPCServer, management.NewRDSService(deps.db, deps.agentsStateUpdater, deps.connectionCheck)) + managementpb.RegisterRDSServer(gRPCServer, management.NewRDSService(deps.db, deps.agentsStateUpdater, deps.connectionCheck, deps.serviceInfoBroker)) azurev1beta1.RegisterAzureDatabaseServer(gRPCServer, management.NewAzureDatabaseService(deps.db, deps.agentsRegistry, deps.agentsStateUpdater, deps.connectionCheck)) managementpb.RegisterHAProxyServer(gRPCServer, management.NewHAProxyService(deps.db, deps.vmdb, deps.agentsStateUpdater, deps.connectionCheck)) managementpb.RegisterExternalServer(gRPCServer, management.NewExternalService(deps.db, deps.vmdb, deps.agentsStateUpdater, deps.connectionCheck)) diff --git a/managed/services/agents/service_info_broker.go b/managed/services/agents/service_info_broker.go index f8529c17a8..cc32a3d2cd 100644 --- a/managed/services/agents/service_info_broker.go +++ b/managed/services/agents/service_info_broker.go @@ -177,7 +177,7 @@ func (c *ServiceInfoBroker) GetInfoFromService(ctx context.Context, q *reform.Qu sInfo, ok := resp.(*agentpb.ServiceInfoResponse) if !ok { - return errors.New("failed to cast response to *agentpb.ServiceInfoResponse") + return status.Error(codes.Internal, "failed to cast response to *agentpb.ServiceInfoResponse") } msg := sInfo.Error diff --git a/managed/services/management/deps.go b/managed/services/management/deps.go index 2c1bcfc51a..012cbd5fd6 100644 --- a/managed/services/management/deps.go +++ b/managed/services/management/deps.go @@ -35,6 +35,7 @@ import ( //go:generate ../../../bin/mockery --name=grafanaClient --case=snake --inpackage --testonly //go:generate ../../../bin/mockery --name=jobsService --case=snake --inpackage --testonly //go:generate ../../../bin/mockery --name=connectionChecker --case=snake --inpackage --testonly +//go:generate ../../../bin/mockery --name=serviceInfoBroker --case=snake --inpackage --testonly //go:generate ../../../bin/mockery --name=versionCache --case=snake --inpackage --testonly //go:generate ../../../bin/mockery --name=victoriaMetricsClient --case=snake --inpackage --testonly diff --git a/managed/services/management/mock_service_info_broker_test.go b/managed/services/management/mock_service_info_broker_test.go new file mode 100644 index 0000000000..893857e16c --- /dev/null +++ b/managed/services/management/mock_service_info_broker_test.go @@ -0,0 +1,46 @@ +// Code generated by mockery v2.33.0. DO NOT EDIT. + +package management + +import ( + context "context" + + mock "github.com/stretchr/testify/mock" + reform "gopkg.in/reform.v1" + + models "github.com/percona/pmm/managed/models" +) + +// mockServiceInfoBroker is an autogenerated mock type for the serviceInfoBroker type +type mockServiceInfoBroker struct { + mock.Mock +} + +// GetInfoFromService provides a mock function with given fields: ctx, q, service, agent +func (_m *mockServiceInfoBroker) GetInfoFromService(ctx context.Context, q *reform.Querier, service *models.Service, agent *models.Agent) error { + ret := _m.Called(ctx, q, service, agent) + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, *reform.Querier, *models.Service, *models.Agent) error); ok { + r0 = rf(ctx, q, service, agent) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// newMockServiceInfoBroker creates a new instance of mockServiceInfoBroker. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockServiceInfoBroker(t interface { + mock.TestingT + Cleanup(func()) +}, +) *mockServiceInfoBroker { + mock := &mockServiceInfoBroker{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/managed/services/management/rds.go b/managed/services/management/rds.go index a669e2c472..e6724ce421 100644 --- a/managed/services/management/rds.go +++ b/managed/services/management/rds.go @@ -52,16 +52,18 @@ type RDSService struct { db *reform.DB state agentsStateUpdater cc connectionChecker + sib serviceInfoBroker managementpb.UnimplementedRDSServer } // NewRDSService creates new instance discovery service. -func NewRDSService(db *reform.DB, state agentsStateUpdater, cc connectionChecker) *RDSService { +func NewRDSService(db *reform.DB, state agentsStateUpdater, cc connectionChecker, sib serviceInfoBroker) *RDSService { return &RDSService{ db: db, state: state, cc: cc, + sib: sib, } } @@ -349,7 +351,10 @@ func (s *RDSService) AddRDS(ctx context.Context, req *managementpb.AddRDSRequest if err = s.cc.CheckConnectionToService(ctx, tx.Querier, service, mysqldExporter); err != nil { return err } - // CheckConnectionToService updates the table count in row so, let's also update the response + if err = s.sib.GetInfoFromService(ctx, tx.Querier, service, mysqldExporter); err != nil { + return err + } + // GetInfoFromService gets additional info in row, let's also update the response res.TableCount = *mysqldExporter.TableCount } @@ -426,6 +431,9 @@ func (s *RDSService) AddRDS(ctx context.Context, req *managementpb.AddRDSRequest if err = s.cc.CheckConnectionToService(ctx, tx.Querier, service, postgresExporter); err != nil { return err } + if err = s.sib.GetInfoFromService(ctx, tx.Querier, service, postgresExporter); err != nil { + return err + } } // add MySQL PerfSchema QAN Agent diff --git a/managed/services/management/rds_test.go b/managed/services/management/rds_test.go index 3cac4518e4..2474f75fe4 100644 --- a/managed/services/management/rds_test.go +++ b/managed/services/management/rds_test.go @@ -55,13 +55,15 @@ func TestRDSService(t *testing.T) { cc := &mockConnectionChecker{} cc.Test(t) + sib := &mockServiceInfoBroker{} + sib.Test(t) state := &mockAgentsStateUpdater{} state.Test(t) defer func() { cc.AssertExpectations(t) state.AssertExpectations(t) }() - s := NewRDSService(db, state, cc) + s := NewRDSService(db, state, cc, sib) t.Run("DiscoverRDS", func(t *testing.T) { t.Run("ListRegions", func(t *testing.T) { From 2148db2d31b188c4a3f3d44b0654ef8be6152abb Mon Sep 17 00:00:00 2001 From: Alex Tymchuk Date: Sat, 23 Sep 2023 11:03:30 +0000 Subject: [PATCH 21/41] PMM-12375 add serviceInfoBroker to azure --- managed/cmd/pmm-managed/main.go | 2 +- managed/services/management/azure_database.go | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/managed/cmd/pmm-managed/main.go b/managed/cmd/pmm-managed/main.go index ba37114898..0441592fdb 100644 --- a/managed/cmd/pmm-managed/main.go +++ b/managed/cmd/pmm-managed/main.go @@ -290,7 +290,7 @@ func runGRPCServer(ctx context.Context, deps *gRPCServerDeps) { managementpb.RegisterProxySQLServer(gRPCServer, managementgrpc.NewManagementProxySQLServer(proxysqlSvc)) managementpb.RegisterActionsServer(gRPCServer, managementgrpc.NewActionsServer(deps.actions, deps.db)) managementpb.RegisterRDSServer(gRPCServer, management.NewRDSService(deps.db, deps.agentsStateUpdater, deps.connectionCheck, deps.serviceInfoBroker)) - azurev1beta1.RegisterAzureDatabaseServer(gRPCServer, management.NewAzureDatabaseService(deps.db, deps.agentsRegistry, deps.agentsStateUpdater, deps.connectionCheck)) + azurev1beta1.RegisterAzureDatabaseServer(gRPCServer, management.NewAzureDatabaseService(deps.db, deps.agentsRegistry, deps.agentsStateUpdater, deps.connectionCheck, deps.serviceInfoBroker)) managementpb.RegisterHAProxyServer(gRPCServer, management.NewHAProxyService(deps.db, deps.vmdb, deps.agentsStateUpdater, deps.connectionCheck)) managementpb.RegisterExternalServer(gRPCServer, management.NewExternalService(deps.db, deps.vmdb, deps.agentsStateUpdater, deps.connectionCheck)) managementpb.RegisterAnnotationServer(gRPCServer, managementgrpc.NewAnnotationServer(deps.db, deps.grafanaClient)) diff --git a/managed/services/management/azure_database.go b/managed/services/management/azure_database.go index dda84b4fae..0fce250174 100644 --- a/managed/services/management/azure_database.go +++ b/managed/services/management/azure_database.go @@ -59,18 +59,20 @@ type AzureDatabaseService struct { registry agentsRegistry state agentsStateUpdater cc connectionChecker + sib serviceInfoBroker azurev1beta1.UnimplementedAzureDatabaseServer } // NewAzureDatabaseService creates new instance discovery service. -func NewAzureDatabaseService(db *reform.DB, registry agentsRegistry, state agentsStateUpdater, cc connectionChecker) *AzureDatabaseService { +func NewAzureDatabaseService(db *reform.DB, registry agentsRegistry, state agentsStateUpdater, cc connectionChecker, sib serviceInfoBroker) *AzureDatabaseService { //nolint:lll return &AzureDatabaseService{ l: logrus.WithField("component", "management/azure_database"), db: db, registry: registry, state: state, cc: cc, + sib: sib, } } @@ -301,6 +303,9 @@ func (s *AzureDatabaseService) AddAzureDatabase(ctx context.Context, req *azurev if err = s.cc.CheckConnectionToService(ctx, tx.Querier, service, metricsExporter); err != nil { return err } + if err = s.sib.GetInfoFromService(ctx, tx.Querier, service, metricsExporter); err != nil { + return err + } } if req.Qan { From 97a819195649e4848d36f0cbfaf31b75fa2797a4 Mon Sep 17 00:00:00 2001 From: Alex Tymchuk Date: Sat, 23 Sep 2023 11:13:34 +0000 Subject: [PATCH 22/41] PMM-12375 add version to ListServices result --- managed/services/management/service_mgmt.go | 1 + 1 file changed, 1 insertion(+) diff --git a/managed/services/management/service_mgmt.go b/managed/services/management/service_mgmt.go index 73f3febf5d..792cef9100 100644 --- a/managed/services/management/service_mgmt.go +++ b/managed/services/management/service_mgmt.go @@ -178,6 +178,7 @@ func (s *MgmtServiceService) ListServices(ctx context.Context, req *servicev1bet ServiceName: service.ServiceName, Socket: pointer.GetString(service.Socket), UpdatedAt: timestamppb.New(service.UpdatedAt), + Version: service.Version, } if metric, ok := metrics[service.ServiceID]; ok { From 3aa01bf09eb867c956ef452baaf8276695bee0c5 Mon Sep 17 00:00:00 2001 From: Alex Tymchuk Date: Mon, 25 Sep 2023 13:13:26 +0000 Subject: [PATCH 23/41] PMM-12375 a minor fix in teardown fn --- managed/services/inventory/services_test.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/managed/services/inventory/services_test.go b/managed/services/inventory/services_test.go index 1be2b931d9..cf2c9e0d82 100644 --- a/managed/services/inventory/services_test.go +++ b/managed/services/inventory/services_test.go @@ -76,7 +76,8 @@ func setup(t *testing.T) (*ServicesService, *AgentsService, *NodesService, func( r.AssertExpectations(t) vmdb.AssertExpectations(t) state.AssertExpectations(t) - cc.Test(t) + cc.AssertExpectations(t) + sib.AssertExpectations(t) } return NewServicesService(db, r, state, vmdb, vc), From bc39c6f3df2df7de4ee814918a0cf6532aa7bdd6 Mon Sep 17 00:00:00 2001 From: Alex Tymchuk Date: Tue, 26 Sep 2023 08:39:57 +0000 Subject: [PATCH 24/41] PMM-12375 cleanup the inevntory_metrics_test --- .../inventory/inventory_metrics_test.go | 54 ++++++++++--------- 1 file changed, 28 insertions(+), 26 deletions(-) diff --git a/managed/services/inventory/inventory_metrics_test.go b/managed/services/inventory/inventory_metrics_test.go index 939ccc7b07..9c2be89e02 100644 --- a/managed/services/inventory/inventory_metrics_test.go +++ b/managed/services/inventory/inventory_metrics_test.go @@ -33,30 +33,6 @@ import ( ) func TestNewInventoryMetricsCollector(t *testing.T) { - metricsMock := &mockInventoryMetrics{} - inventoryCollector := NewInventoryMetricsCollector(metricsMock) - - agentMetrics := []Metric{ - { - labels: []string{"A1", string(models.PMMAgentType), "S1", "N1", "NN1", "PA1", strconv.Itoa(1), "V1"}, - value: float64(1), - }, - } - - nodeMetrics := []Metric{ - { - labels: []string{"N1", string(models.GenericNodeType), "N1", "C1"}, - value: float64(1), - }, - } - - serviceMetrics := []Metric{ - { - labels: []string{"C1", string(models.ProxySQLServiceType), "N1"}, - value: float64(1), - }, - } - t.Run("Metrics returns inventory metrics", func(t *testing.T) { client := http.Client{} @@ -80,6 +56,34 @@ func TestNewInventoryMetricsCollector(t *testing.T) { }) t.Run("Collector", func(t *testing.T) { + metricsMock := &mockInventoryMetrics{} + metricsMock.Test(t) + + t.Cleanup(func() { metricsMock.AssertExpectations(t) }) + + inventoryCollector := NewInventoryMetricsCollector(metricsMock) + + agentMetrics := []Metric{ + { + labels: []string{"A1", string(models.PMMAgentType), "S1", "N1", "NN1", "PA1", strconv.Itoa(1), "V1"}, + value: float64(1), + }, + } + + nodeMetrics := []Metric{ + { + labels: []string{"N1", string(models.GenericNodeType), "N1", "C1"}, + value: float64(1), + }, + } + + serviceMetrics := []Metric{ + { + labels: []string{"C1", string(models.ProxySQLServiceType), "N1"}, + value: float64(1), + }, + } + metricsMock.On("GetAgentMetrics", mock.Anything).Return(agentMetrics, nil) metricsMock.On("GetNodeMetrics", mock.Anything).Return(nodeMetrics, nil) metricsMock.On("GetServiceMetrics", mock.Anything).Return(serviceMetrics, nil) @@ -122,7 +126,5 @@ func TestNewInventoryMetricsCollector(t *testing.T) { "pmm_managed_inventory_services"); err != nil { t.Errorf("Unexpected collecting result:\n%s", err) } - - metricsMock.AssertExpectations(t) }) } From ee6a91a81fae326587975f8e13bee1bb769528a0 Mon Sep 17 00:00:00 2001 From: Alex Tymchuk Date: Tue, 26 Sep 2023 14:33:27 +0000 Subject: [PATCH 25/41] PMM-12375 follow up on review --- managed/services/agents/connection_checker.go | 4 ++-- managed/services/agents/service_info_broker.go | 17 ++++++----------- .../services/backup/pitr_timerange_service.go | 2 +- managed/services/telemetry/config.default.yml | 11 +++++++++++ 4 files changed, 20 insertions(+), 14 deletions(-) diff --git a/managed/services/agents/connection_checker.go b/managed/services/agents/connection_checker.go index acc80d71e9..7edf9caed0 100644 --- a/managed/services/agents/connection_checker.go +++ b/managed/services/agents/connection_checker.go @@ -92,7 +92,7 @@ func (c *ConnectionChecker) CheckConnectionToService(ctx context.Context, q *ref return err } - request, err := createConnectionRequest(q, service, agent) + request, err := connectionRequest(q, service, agent) if err != nil { return err } @@ -119,7 +119,7 @@ func (c *ConnectionChecker) CheckConnectionToService(ctx context.Context, q *ref return status.Error(codes.FailedPrecondition, fmt.Sprintf("Connection check failed: %s.", msg)) } -func createConnectionRequest(q *reform.Querier, service *models.Service, agent *models.Agent) (*agentpb.CheckConnectionRequest, error) { +func connectionRequest(q *reform.Querier, service *models.Service, agent *models.Agent) (*agentpb.CheckConnectionRequest, error) { var request *agentpb.CheckConnectionRequest switch service.ServiceType { case models.MySQLServiceType: diff --git a/managed/services/agents/service_info_broker.go b/managed/services/agents/service_info_broker.go index cc32a3d2cd..88c497b038 100644 --- a/managed/services/agents/service_info_broker.go +++ b/managed/services/agents/service_info_broker.go @@ -47,7 +47,7 @@ func NewServiceInfoBroker(r *Registry) *ServiceInfoBroker { } } -func createServiceInfoRequest(q *reform.Querier, service *models.Service, agent *models.Agent) (*agentpb.ServiceInfoRequest, error) { +func serviceInfoRequest(q *reform.Querier, service *models.Service, agent *models.Agent) (*agentpb.ServiceInfoRequest, error) { var request *agentpb.ServiceInfoRequest switch service.ServiceType { case models.MySQLServiceType: @@ -137,9 +137,6 @@ func (c *ServiceInfoBroker) GetInfoFromService(ctx context.Context, q *reform.Qu } pmmAgentID := pointer.GetString(agent.PMMAgentID) - if !agent.PushMetrics && (service.ServiceType == models.ExternalServiceType || service.ServiceType == models.HAProxyServiceType) { - pmmAgentID = models.PMMServerAgentID - } // Skip check connection to external exporter with old pmm-agent. if service.ServiceType == models.ExternalServiceType || service.ServiceType == models.HAProxyServiceType { @@ -158,7 +155,7 @@ func (c *ServiceInfoBroker) GetInfoFromService(ctx context.Context, q *reform.Qu return err } - request, err := createServiceInfoRequest(q, service, agent) + request, err := serviceInfoRequest(q, service, agent) if err != nil { return err } @@ -195,14 +192,12 @@ func (c *ServiceInfoBroker) GetInfoFromService(ctx context.Context, q *reform.Qu return errors.Wrap(err, "failed to update table count") } return updateServiceVersion(ctx, q, resp, service) + case models.PostgreSQLServiceType, + models.MongoDBServiceType, + models.ProxySQLServiceType: + return updateServiceVersion(ctx, q, resp, service) case models.ExternalServiceType, models.HAProxyServiceType: return nil - case models.PostgreSQLServiceType: - return updateServiceVersion(ctx, q, resp, service) - case models.MongoDBServiceType: - return updateServiceVersion(ctx, q, resp, service) - case models.ProxySQLServiceType: - return updateServiceVersion(ctx, q, resp, service) default: return errors.Errorf("unhandled Service type %s", service.ServiceType) } diff --git a/managed/services/backup/pitr_timerange_service.go b/managed/services/backup/pitr_timerange_service.go index 34d406850c..000ca1c22c 100644 --- a/managed/services/backup/pitr_timerange_service.go +++ b/managed/services/backup/pitr_timerange_service.go @@ -251,7 +251,7 @@ func getTimelines(slices []*oplogChunk) []Timeline { var timelines []Timeline var prevEnd primitive.Timestamp for _, s := range slices { - if prevEnd.T != 0 && prevEnd.Compare(s.StartTS) == -1 { + if prevEnd.T != 0 && primitive.CompareTimestamp(prevEnd, s.StartTS) == -1 { timelines = append(timelines, tl) tl = Timeline{} } diff --git a/managed/services/telemetry/config.default.yml b/managed/services/telemetry/config.default.yml index 74924104e0..01b11a214d 100644 --- a/managed/services/telemetry/config.default.yml +++ b/managed/services/telemetry/config.default.yml @@ -936,3 +936,14 @@ telemetry: data: - metric_name: "postgresql_db_count" value: 1 + + - id: PMM + source: ENVVAR + # query: count by (service_id) (pg_stat_database_tup_fetched{service_name!="pmm-server-postgresql", datname!~"template.*|postgres", datid!="0"}) + struct: + - PMM_TEST_AJKHKHK_HKHJKHJ + - + summary: "Number of databases monitored per PostgreSQL server" + data: + - metric_name: "postgresql_db_count" + value: 1 From b345c2e1d370d00083aa5971f6139cff62bc4244 Mon Sep 17 00:00:00 2001 From: Alex Tymchuk Date: Tue, 26 Sep 2023 14:42:36 +0000 Subject: [PATCH 26/41] PMM-12375 revert changes, move to other PRs --- .github/CODEOWNERS | 5 +++++ .golangci.yml | 4 ---- agent/runner/jobs/pbm_helpers.go | 2 +- managed/services/management/grpc/mysql_server.go | 2 +- managed/services/telemetry/config.default.yml | 11 ----------- 5 files changed, 7 insertions(+), 17 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 68d20180a2..71e4fab6ff 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,11 +1,16 @@ * @percona/pmm-review-be +/build/ @atymchuk @percona/pmm-review-be +/admin/ @percona/pmm-review-be /agent/agents/postgres/ @JiriCtvrtka @percona/pmm-review-be /agent/runner/ @artemgavrilov @percona/pmm-review-be /api/ @BupycHuk @percona/pmm-review-be +/docs/api/ @atymchuk @percona/pmm-review-be /managed/services/checks/ @idoqo @percona/pmm-review-be +/managed/ @percona/pmm-review-be /managed/services/dbaas @gen1us2k @recharte @percona/pmm-review-be /managed/services/management/dbaas @gen1us2k @recharte @percona/pmm-review-be /update/ @BupycHuk @talhabinrizwan @percona/pmm-review-be +/api-tests/ @percona/pmm-review-be **/go.mod @percona/pmm-review-dependency @percona/pmm-review-be **/Dockerfile @percona/pmm-review-dependency @percona/pmm-review-be /cli-tests/package.json @percona/pmm-review-dependency @yurkovychv diff --git a/.golangci.yml b/.golangci.yml index 14c7733058..ff07ed391b 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -103,12 +103,8 @@ linters: - maligned # deprecated - nlreturn # too annoying - nosnakecase # deprecated - - rowserrcheck # disabled because of generics - scopelint # too many false positives - - structcheck # replaced by unused - - varcheck # replaced by unused - varnamelen # useless - - wastedassign # disabled because of generics - wrapcheck # we do not use wrapping everywhere - wsl # too annoying diff --git a/agent/runner/jobs/pbm_helpers.go b/agent/runner/jobs/pbm_helpers.go index 0ede95084a..09e9c4006b 100644 --- a/agent/runner/jobs/pbm_helpers.go +++ b/agent/runner/jobs/pbm_helpers.go @@ -279,7 +279,7 @@ func waitForPBMBackup(ctx context.Context, l logrus.FieldLogger, dbURL *string, return nil case "canceled": return errors.New("backup was canceled") - case "error": + case "error": //nolint:goconst return errors.New(info.Error) } diff --git a/managed/services/management/grpc/mysql_server.go b/managed/services/management/grpc/mysql_server.go index 6753a6c4db..43048d48cc 100644 --- a/managed/services/management/grpc/mysql_server.go +++ b/managed/services/management/grpc/mysql_server.go @@ -22,7 +22,7 @@ import ( "github.com/percona/pmm/managed/services/management" ) -// TODO merge into ../mysql.go. +// TODO merge into ../mysql.go type mySQLServer struct { svc *management.MySQLService diff --git a/managed/services/telemetry/config.default.yml b/managed/services/telemetry/config.default.yml index 01b11a214d..74924104e0 100644 --- a/managed/services/telemetry/config.default.yml +++ b/managed/services/telemetry/config.default.yml @@ -936,14 +936,3 @@ telemetry: data: - metric_name: "postgresql_db_count" value: 1 - - - id: PMM - source: ENVVAR - # query: count by (service_id) (pg_stat_database_tup_fetched{service_name!="pmm-server-postgresql", datname!~"template.*|postgres", datid!="0"}) - struct: - - PMM_TEST_AJKHKHK_HKHJKHJ - - - summary: "Number of databases monitored per PostgreSQL server" - data: - - metric_name: "postgresql_db_count" - value: 1 From 4983e2d921d35b32d7b98374c104796f31d9cdf5 Mon Sep 17 00:00:00 2001 From: Alex Tymchuk Date: Tue, 26 Sep 2023 15:40:33 +0000 Subject: [PATCH 27/41] PMM-12375 revert changed related to linter --- managed/services/agents/grpc/agent_server.go | 2 +- managed/services/agents/log_level.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/managed/services/agents/grpc/agent_server.go b/managed/services/agents/grpc/agent_server.go index 69eced0a99..da6e23502d 100644 --- a/managed/services/agents/grpc/agent_server.go +++ b/managed/services/agents/grpc/agent_server.go @@ -40,7 +40,7 @@ func (s *agentServer) Connect(stream agentpb.Agent_ConnectServer) error { return s.handler.Run(stream) } -// check interfaces. +// check interfaces var ( _ agentpb.AgentServer = (*agentServer)(nil) ) diff --git a/managed/services/agents/log_level.go b/managed/services/agents/log_level.go index 9eea4125ca..a7cc24c273 100644 --- a/managed/services/agents/log_level.go +++ b/managed/services/agents/log_level.go @@ -22,11 +22,11 @@ import ( "github.com/percona/pmm/version" ) -// Log level available in exporters with pmm 2.28.0 and up. +// Log level available in exporters with pmm 2.28 var exporterLogLevelCommandVersion = version.MustParse("2.27.99") // withLogLevel - append CLI args --log.level -// mysqld_exporter, node_exporter and postgres_exporter don't support --log.level=fatal. +// mysqld_exporter, node_exporter and postgres_exporter don't support --log.level=fatal func withLogLevel(args []string, logLevel *string, pmmAgentVersion *version.Parsed, supportLogLevelFatal bool) []string { level := pointer.GetString(logLevel) From e36b21802191d5893d6ab496e257d42216c1ca6b Mon Sep 17 00:00:00 2001 From: Alex Tymchuk Date: Wed, 27 Sep 2023 14:39:46 +0000 Subject: [PATCH 28/41] PMM-12375 make version nullable --- managed/models/service_model.go | 2 +- managed/services/agents/service_info_broker.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/managed/models/service_model.go b/managed/models/service_model.go index 9021ae117c..0378272296 100644 --- a/managed/models/service_model.go +++ b/managed/models/service_model.go @@ -58,7 +58,7 @@ type Service struct { ReplicationSet string `reform:"replication_set"` CustomLabels []byte `reform:"custom_labels"` ExternalGroup string `reform:"external_group"` - Version string `reform:"version"` + Version *string `reform:"version"` CreatedAt time.Time `reform:"created_at"` UpdatedAt time.Time `reform:"updated_at"` diff --git a/managed/services/agents/service_info_broker.go b/managed/services/agents/service_info_broker.go index 88c497b038..bf2df5e19d 100644 --- a/managed/services/agents/service_info_broker.go +++ b/managed/services/agents/service_info_broker.go @@ -212,7 +212,7 @@ func updateServiceVersion(ctx context.Context, q *reform.Querier, resp agentpb.A } l.Debugf("Updating service version: %s.", version) - service.Version = version + service.Version = &version if err := q.Update(service); err != nil { return errors.Wrap(err, "failed to update service version") } From 50d5d4bf8f9524e5392e13cce0511f213d1c694a Mon Sep 17 00:00:00 2001 From: Alex Tymchuk Date: Wed, 27 Sep 2023 14:46:24 +0000 Subject: [PATCH 29/41] PMM-12375 do not call FindService when skipping connection check --- managed/services/inventory/agents.go | 40 ++++++++++++++-------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/managed/services/inventory/agents.go b/managed/services/inventory/agents.go index 271ab0acac..3e36deecc4 100644 --- a/managed/services/inventory/agents.go +++ b/managed/services/inventory/agents.go @@ -262,12 +262,12 @@ func (as *AgentsService) AddMySQLdExporter(ctx context.Context, req *inventorypb return err } - service, err := models.FindServiceByID(tx.Querier, req.ServiceId) - if err != nil { - return err - } - if !req.SkipConnectionCheck { + service, err := models.FindServiceByID(tx.Querier, req.ServiceId) + if err != nil { + return err + } + if err = as.cc.CheckConnectionToService(ctx, tx.Querier, service, row); err != nil { return err } @@ -327,12 +327,12 @@ func (as *AgentsService) AddMongoDBExporter(ctx context.Context, req *inventoryp return err } - service, err := models.FindServiceByID(tx.Querier, req.ServiceId) - if err != nil { - return err - } - if !req.SkipConnectionCheck { + service, err := models.FindServiceByID(tx.Querier, req.ServiceId) + if err != nil { + return err + } + if err = as.cc.CheckConnectionToService(ctx, tx.Querier, service, row); err != nil { return err } @@ -521,12 +521,12 @@ func (as *AgentsService) AddPostgresExporter(ctx context.Context, req *inventory return err } - service, err := models.FindServiceByID(tx.Querier, req.ServiceId) - if err != nil { - return err - } - if !req.SkipConnectionCheck { + service, err := models.FindServiceByID(tx.Querier, req.ServiceId) + if err != nil { + return err + } + if err = as.cc.CheckConnectionToService(ctx, tx.Querier, service, row); err != nil { return err } @@ -649,12 +649,12 @@ func (as *AgentsService) AddProxySQLExporter(ctx context.Context, req *inventory return err } - service, err := models.FindServiceByID(tx.Querier, req.ServiceId) - if err != nil { - return err - } - if !req.SkipConnectionCheck { + service, err := models.FindServiceByID(tx.Querier, req.ServiceId) + if err != nil { + return err + } + if err = as.cc.CheckConnectionToService(ctx, tx.Querier, service, row); err != nil { return err } From ae70e5145b96424d151fc64dc90b94f49ccb7485 Mon Sep 17 00:00:00 2001 From: Alex Tymchuk Date: Wed, 27 Sep 2023 14:47:52 +0000 Subject: [PATCH 30/41] PMM-12375 fix pointer reference --- managed/services/management/service_mgmt.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/managed/services/management/service_mgmt.go b/managed/services/management/service_mgmt.go index 792cef9100..e071f9249d 100644 --- a/managed/services/management/service_mgmt.go +++ b/managed/services/management/service_mgmt.go @@ -178,7 +178,7 @@ func (s *MgmtServiceService) ListServices(ctx context.Context, req *servicev1bet ServiceName: service.ServiceName, Socket: pointer.GetString(service.Socket), UpdatedAt: timestamppb.New(service.UpdatedAt), - Version: service.Version, + Version: *service.Version, } if metric, ok := metrics[service.ServiceID]; ok { From b27788223ddb47e8253230017450203f67dc8a8d Mon Sep 17 00:00:00 2001 From: Alex Tymchuk Date: Wed, 27 Sep 2023 15:02:24 +0000 Subject: [PATCH 31/41] PMM-12375 re-generate interfaces --- managed/models/service_model_reform.go | 2 +- .../services/agents/service_info_broker.go | 30 ------------------- 2 files changed, 1 insertion(+), 31 deletions(-) diff --git a/managed/models/service_model_reform.go b/managed/models/service_model_reform.go index b3ce66fab6..8169bd6dd5 100644 --- a/managed/models/service_model_reform.go +++ b/managed/models/service_model_reform.go @@ -78,7 +78,7 @@ var ServiceTable = &serviceTableType{ {Name: "ReplicationSet", Type: "string", Column: "replication_set"}, {Name: "CustomLabels", Type: "[]uint8", Column: "custom_labels"}, {Name: "ExternalGroup", Type: "string", Column: "external_group"}, - {Name: "Version", Type: "string", Column: "version"}, + {Name: "Version", Type: "*string", Column: "version"}, {Name: "CreatedAt", Type: "time.Time", Column: "created_at"}, {Name: "UpdatedAt", Type: "time.Time", Column: "updated_at"}, {Name: "Address", Type: "*string", Column: "address"}, diff --git a/managed/services/agents/service_info_broker.go b/managed/services/agents/service_info_broker.go index bf2df5e19d..1223d02e31 100644 --- a/managed/services/agents/service_info_broker.go +++ b/managed/services/agents/service_info_broker.go @@ -32,7 +32,6 @@ import ( "github.com/percona/pmm/api/inventorypb" "github.com/percona/pmm/managed/models" "github.com/percona/pmm/utils/logger" - "github.com/percona/pmm/version" ) // ServiceInfoBroker checks if connection can be established to service. @@ -137,19 +136,6 @@ func (c *ServiceInfoBroker) GetInfoFromService(ctx context.Context, q *reform.Qu } pmmAgentID := pointer.GetString(agent.PMMAgentID) - - // Skip check connection to external exporter with old pmm-agent. - if service.ServiceType == models.ExternalServiceType || service.ServiceType == models.HAProxyServiceType { - isSupported, err := isExternalExporterServiceInfoSupported(q, pmmAgentID) - if err != nil { - return err - } - - if !isSupported { - return nil - } - } - pmmAgent, err := c.r.get(pmmAgentID) if err != nil { return err @@ -219,19 +205,3 @@ func updateServiceVersion(ctx context.Context, q *reform.Querier, resp agentpb.A return nil } - -func isExternalExporterServiceInfoSupported(q *reform.Querier, pmmAgentID string) (bool, error) { - pmmAgent, err := models.FindAgentByID(q, pmmAgentID) - if err != nil { - return false, fmt.Errorf("failed to get PMM Agent: %w", err) - } - pmmAgentVersion, err := version.Parse(*pmmAgent.Version) - if err != nil { - return false, fmt.Errorf("failed to parse PMM agent version %q: %w", *pmmAgent.Version, err) - } - - if pmmAgentVersion.Less(checkExternalExporterConnectionPMMVersion) { - return false, nil - } - return true, nil -} From d588a58f3d5da2b132d53287a5ff0355e5978663 Mon Sep 17 00:00:00 2001 From: Alex Tymchuk Date: Wed, 27 Sep 2023 18:18:59 +0000 Subject: [PATCH 32/41] PMM-12375 fix a dereference --- managed/services/management/service_mgmt.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/managed/services/management/service_mgmt.go b/managed/services/management/service_mgmt.go index e071f9249d..d0ae57addf 100644 --- a/managed/services/management/service_mgmt.go +++ b/managed/services/management/service_mgmt.go @@ -178,7 +178,7 @@ func (s *MgmtServiceService) ListServices(ctx context.Context, req *servicev1bet ServiceName: service.ServiceName, Socket: pointer.GetString(service.Socket), UpdatedAt: timestamppb.New(service.UpdatedAt), - Version: *service.Version, + Version: pointer.GetString(service.Version), } if metric, ok := metrics[service.ServiceID]; ok { From 2e916278edcc9b8a2c120a2eba868fdd381f0958 Mon Sep 17 00:00:00 2001 From: Alex Tymchuk Date: Sun, 1 Oct 2023 23:37:45 +0000 Subject: [PATCH 33/41] PMM-12375 make ServiceInfoBroker work for older agents --- .../serviceinfobroker/service_info_broker.go | 6 +-- managed/services/agents/connection_checker.go | 39 +++++++++++++------ .../services/agents/service_info_broker.go | 34 ++++++++++++++-- 3 files changed, 62 insertions(+), 17 deletions(-) diff --git a/agent/serviceinfobroker/service_info_broker.go b/agent/serviceinfobroker/service_info_broker.go index 2dca353cf0..54259f2fab 100644 --- a/agent/serviceinfobroker/service_info_broker.go +++ b/agent/serviceinfobroker/service_info_broker.go @@ -38,18 +38,18 @@ import ( "github.com/percona/pmm/api/inventorypb" ) -// configGetter allows for getting a config. +// configGetter allows to get a config. type configGetter interface { Get() *config.Config } -// ServiceInfoBroker is a struct to check connection to services. +// ServiceInfoBroker helps query various information from services. type ServiceInfoBroker struct { l *logrus.Entry cfg configGetter } -// New creates new ServiceInfoBroker. +// New creates a new ServiceInfoBroker. func New(cfg configGetter) *ServiceInfoBroker { return &ServiceInfoBroker{ l: logrus.WithField("component", "serviceinfobroker"), diff --git a/managed/services/agents/connection_checker.go b/managed/services/agents/connection_checker.go index 7edf9caed0..93355d9860 100644 --- a/managed/services/agents/connection_checker.go +++ b/managed/services/agents/connection_checker.go @@ -59,17 +59,6 @@ func (c *ConnectionChecker) CheckConnectionToService(ctx context.Context, q *ref } }() - switch service.ServiceType { - case models.MySQLServiceType, - models.PostgreSQLServiceType, - models.MongoDBServiceType, - models.ProxySQLServiceType, - models.ExternalServiceType, - models.HAProxyServiceType: - default: - return errors.Errorf("unhandled Service type %s", service.ServiceType) - } - pmmAgentID := pointer.GetString(agent.PMMAgentID) if !agent.PushMetrics && (service.ServiceType == models.ExternalServiceType || service.ServiceType == models.HAProxyServiceType) { pmmAgentID = models.PMMServerAgentID @@ -109,6 +98,34 @@ func (c *ConnectionChecker) CheckConnectionToService(ctx context.Context, q *ref } l.Infof("CheckConnection response: %+v.", resp) + switch service.ServiceType { + case models.MySQLServiceType: + // TODO: remove the whole block after v3 release. + isSibSupported, err := isServiceInfoBrokerSupported(q, pmmAgentID) + if err != nil { + l.Warnf("Failed to check if SIB is supported: %s.", err) + } + // In newer clients this gets handled by the ServiceInfoBroker. + if !isSibSupported { + tableCount := resp.(*agentpb.CheckConnectionResponse).GetStats().GetTableCount() //nolint:forcetypeassert + agent.TableCount = &tableCount + // l.Debugf("Updating table count: %d.", tableCount) + l.Infof("Updating table count: %d.", tableCount) + if err = q.Update(agent); err != nil { + return errors.Wrap(err, "failed to update table count") + } + } + case models.ExternalServiceType, + models.HAProxyServiceType, + models.PostgreSQLServiceType, + models.MongoDBServiceType, + models.ProxySQLServiceType: + // nothing yet + + default: + return errors.Errorf("unhandled Service type %s", service.ServiceType) + } + msg := resp.(*agentpb.CheckConnectionResponse).Error //nolint:forcetypeassert switch msg { case "": diff --git a/managed/services/agents/service_info_broker.go b/managed/services/agents/service_info_broker.go index 1223d02e31..e62fd68853 100644 --- a/managed/services/agents/service_info_broker.go +++ b/managed/services/agents/service_info_broker.go @@ -32,14 +32,17 @@ import ( "github.com/percona/pmm/api/inventorypb" "github.com/percona/pmm/managed/models" "github.com/percona/pmm/utils/logger" + "github.com/percona/pmm/version" ) -// ServiceInfoBroker checks if connection can be established to service. +var sericeInfoBrokerPMMVersion = version.MustParse("2.39.99") + +// ServiceInfoBroker helps query various information from services. type ServiceInfoBroker struct { r *Registry } -// NewServiceInfoBroker creates new connection checker. +// NewServiceInfoBroker creates a new ServiceInfoBroker. func NewServiceInfoBroker(r *Registry) *ServiceInfoBroker { return &ServiceInfoBroker{ r: r, @@ -130,12 +133,21 @@ func (c *ServiceInfoBroker) GetInfoFromService(ctx context.Context, q *reform.Qu } }() + pmmAgentID := pointer.GetString(agent.PMMAgentID) + isSibSupported, err := isServiceInfoBrokerSupported(q, pmmAgentID) + if err != nil { + return err + } + + if !isSibSupported { + return nil + } + // External exporters and haproxy do not support this functionality. if service.ServiceType == models.ExternalServiceType || service.ServiceType == models.HAProxyServiceType { return nil } - pmmAgentID := pointer.GetString(agent.PMMAgentID) pmmAgent, err := c.r.get(pmmAgentID) if err != nil { return err @@ -205,3 +217,19 @@ func updateServiceVersion(ctx context.Context, q *reform.Querier, resp agentpb.A return nil } + +func isServiceInfoBrokerSupported(q *reform.Querier, pmmAgentID string) (bool, error) { + pmmAgent, err := models.FindAgentByID(q, pmmAgentID) + if err != nil { + return false, fmt.Errorf("failed to get PMM Agent: %w", err) + } + pmmAgentVersion, err := version.Parse(*pmmAgent.Version) + if err != nil { + return false, fmt.Errorf("failed to parse PMM agent version %q: %w", *pmmAgent.Version, err) + } + + if pmmAgentVersion.Less(sericeInfoBrokerPMMVersion) { + return false, nil + } + return true, nil +} From de16f658dac80dcfc7027f42ad59d793241391f3 Mon Sep 17 00:00:00 2001 From: Alex Demidoff Date: Sun, 1 Oct 2023 23:56:46 +0000 Subject: [PATCH 34/41] PMM-12375 fix the linter error --- managed/services/agents/connection_checker.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/managed/services/agents/connection_checker.go b/managed/services/agents/connection_checker.go index b4b9d82d8c..a97224530c 100644 --- a/managed/services/agents/connection_checker.go +++ b/managed/services/agents/connection_checker.go @@ -107,7 +107,7 @@ func (c *ConnectionChecker) CheckConnectionToService(ctx context.Context, q *ref } // In newer clients this gets handled by the ServiceInfoBroker. if !isSibSupported { - tableCount := resp.(*agentpb.CheckConnectionResponse).GetStats().GetTableCount() //nolint:forcetypeassert + tableCount := resp.(*agentpb.CheckConnectionResponse).GetStats().GetTableCount() //nolint:forcetypeassert,staticcheck agent.TableCount = &tableCount l.Debugf("Updating table count: %d.", tableCount) if err = q.Update(agent); err != nil { From 775ef7cb184249633a0824548ffb71425c394a74 Mon Sep 17 00:00:00 2001 From: Alex Demidoff Date: Mon, 2 Oct 2023 09:08:02 +0000 Subject: [PATCH 35/41] PMM-12375 follow up on review --- managed/services/agents/service_info_broker.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/managed/services/agents/service_info_broker.go b/managed/services/agents/service_info_broker.go index e62fd68853..e3b87cd0b0 100644 --- a/managed/services/agents/service_info_broker.go +++ b/managed/services/agents/service_info_broker.go @@ -133,6 +133,11 @@ func (c *ServiceInfoBroker) GetInfoFromService(ctx context.Context, q *reform.Qu } }() + // External exporters and haproxy do not support this functionality. + if service.ServiceType == models.ExternalServiceType || service.ServiceType == models.HAProxyServiceType { + return nil + } + pmmAgentID := pointer.GetString(agent.PMMAgentID) isSibSupported, err := isServiceInfoBrokerSupported(q, pmmAgentID) if err != nil { @@ -143,11 +148,6 @@ func (c *ServiceInfoBroker) GetInfoFromService(ctx context.Context, q *reform.Qu return nil } - // External exporters and haproxy do not support this functionality. - if service.ServiceType == models.ExternalServiceType || service.ServiceType == models.HAProxyServiceType { - return nil - } - pmmAgent, err := c.r.get(pmmAgentID) if err != nil { return err From e323f0302a243b0e6db75576cb59333923778104 Mon Sep 17 00:00:00 2001 From: Alex Demidoff Date: Mon, 2 Oct 2023 14:53:35 +0000 Subject: [PATCH 36/41] PMM-12375 a few corrections to managed's readme.md --- managed/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/managed/README.md b/managed/README.md index 3a496ad092..bab621bbf7 100644 --- a/managed/README.md +++ b/managed/README.md @@ -1,5 +1,5 @@ # Percona Monitoring and Management (PMM) management daemon **pmm-managed** manages the configuration of [PMM](https://docs.percona.com/percona-monitoring-and-management/index.html) -server components (VictoriaMetrics, Grafana, etc.) and exposes APIs for interacting with them. Those APIs are also used by -[pmm-admin tool](https://github.com/percona/pmm-admin). +server components (VictoriaMetrics, Grafana, QAN, etc.) and exposes APIs for interacting with them. Those APIs are also used by +[pmm-admin tool](https://github.com/percona/pmm/tree/main/admin). From a543266b00263e8dee3fb776ec0c959fdaabfd31 Mon Sep 17 00:00:00 2001 From: Alex Demidoff Date: Wed, 11 Oct 2023 14:08:40 +0000 Subject: [PATCH 37/41] PMM-12375 fix the mock file version --- agent/client/mock_service_info_broker_test.go | 2 +- managed/services/inventory/mock_service_info_broker_test.go | 2 +- managed/services/management/mock_service_info_broker_test.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/agent/client/mock_service_info_broker_test.go b/agent/client/mock_service_info_broker_test.go index bceb3d7046..5ba542724f 100644 --- a/agent/client/mock_service_info_broker_test.go +++ b/agent/client/mock_service_info_broker_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.33.0. DO NOT EDIT. +// Code generated by mockery v2.35.1. DO NOT EDIT. package client diff --git a/managed/services/inventory/mock_service_info_broker_test.go b/managed/services/inventory/mock_service_info_broker_test.go index 6cc2d01178..b6fbba42fd 100644 --- a/managed/services/inventory/mock_service_info_broker_test.go +++ b/managed/services/inventory/mock_service_info_broker_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.33.0. DO NOT EDIT. +// Code generated by mockery v2.35.1. DO NOT EDIT. package inventory diff --git a/managed/services/management/mock_service_info_broker_test.go b/managed/services/management/mock_service_info_broker_test.go index 893857e16c..1026c5ff78 100644 --- a/managed/services/management/mock_service_info_broker_test.go +++ b/managed/services/management/mock_service_info_broker_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.33.0. DO NOT EDIT. +// Code generated by mockery v2.35.1. DO NOT EDIT. package management From 8c6346ba8dd6c18ea84a3bd438e6320ab1d219ae Mon Sep 17 00:00:00 2001 From: Alex Demidoff Date: Fri, 20 Oct 2023 07:34:49 +0000 Subject: [PATCH 38/41] PMM-12375 bump up the compatibility version --- agent/client/channel/channel.go | 2 +- managed/services/agents/channel/channel.go | 2 +- managed/services/agents/connection_checker.go | 2 +- managed/services/agents/service_info_broker.go | 7 ++++++- 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/agent/client/channel/channel.go b/agent/client/channel/channel.go index b7db0f0aae..3d76c5a697 100644 --- a/agent/client/channel/channel.go +++ b/agent/client/channel/channel.go @@ -316,7 +316,7 @@ func (c *Channel) runReceiver() { } c.Send(&AgentResponse{ ID: msg.Id, - Status: grpcstatus.New(codes.Unimplemented, "can't handle message type send, it is not implemented"), + Status: grpcstatus.New(codes.Unimplemented, "can't handle message type sent, it is not implemented"), }) } } diff --git a/managed/services/agents/channel/channel.go b/managed/services/agents/channel/channel.go index ace57acd37..cb2b6a66b5 100644 --- a/managed/services/agents/channel/channel.go +++ b/managed/services/agents/channel/channel.go @@ -298,7 +298,7 @@ func (c *Channel) runReceiver() { } c.Send(&ServerResponse{ ID: msg.Id, - Status: grpcstatus.New(codes.Unimplemented, "can't handle message type send, it is not implemented"), + Status: grpcstatus.New(codes.Unimplemented, "can't handle message type sent, it is not implemented"), }) } } diff --git a/managed/services/agents/connection_checker.go b/managed/services/agents/connection_checker.go index a97224530c..283fc95669 100644 --- a/managed/services/agents/connection_checker.go +++ b/managed/services/agents/connection_checker.go @@ -103,7 +103,7 @@ func (c *ConnectionChecker) CheckConnectionToService(ctx context.Context, q *ref // TODO: remove the whole block after v3 release. isSibSupported, err := isServiceInfoBrokerSupported(q, pmmAgentID) if err != nil { - l.Warnf("Failed to check if SIB is supported: %s.", err) + l.Warnf("Failed to check if serviceInfoBroker is supported: %s.", err) } // In newer clients this gets handled by the ServiceInfoBroker. if !isSibSupported { diff --git a/managed/services/agents/service_info_broker.go b/managed/services/agents/service_info_broker.go index e3b87cd0b0..797a1943fb 100644 --- a/managed/services/agents/service_info_broker.go +++ b/managed/services/agents/service_info_broker.go @@ -35,7 +35,7 @@ import ( "github.com/percona/pmm/version" ) -var sericeInfoBrokerPMMVersion = version.MustParse("2.39.99") +var sericeInfoBrokerPMMVersion = version.MustParse("2.40.99") // ServiceInfoBroker helps query various information from services. type ServiceInfoBroker struct { @@ -49,6 +49,7 @@ func NewServiceInfoBroker(r *Registry) *ServiceInfoBroker { } } +// ServiceInfoRequest creates a ServiceInfoRequest for a given service. func serviceInfoRequest(q *reform.Querier, service *models.Service, agent *models.Agent) (*agentpb.ServiceInfoRequest, error) { var request *agentpb.ServiceInfoRequest switch service.ServiceType { @@ -140,6 +141,9 @@ func (c *ServiceInfoBroker) GetInfoFromService(ctx context.Context, q *reform.Qu pmmAgentID := pointer.GetString(agent.PMMAgentID) isSibSupported, err := isServiceInfoBrokerSupported(q, pmmAgentID) + + l.Warnf("ServiceInfoBroker supported: %t.", isSibSupported) + if err != nil { return err } @@ -218,6 +222,7 @@ func updateServiceVersion(ctx context.Context, q *reform.Querier, resp agentpb.A return nil } +// isServiceInfoBrokerSupported checks if PMM Agent supports ServiceInfoBroker. func isServiceInfoBrokerSupported(q *reform.Querier, pmmAgentID string) (bool, error) { pmmAgent, err := models.FindAgentByID(q, pmmAgentID) if err != nil { From 22d91cc300c9148cccc4b40aae2057f8c519fcb6 Mon Sep 17 00:00:00 2001 From: Alex Demidoff Date: Fri, 20 Oct 2023 15:56:08 +0000 Subject: [PATCH 39/41] PMM-12375 regen the mockfiles --- agent/client/mock_service_info_broker_test.go | 2 +- managed/services/inventory/mock_service_info_broker_test.go | 2 +- managed/services/management/mock_service_info_broker_test.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/agent/client/mock_service_info_broker_test.go b/agent/client/mock_service_info_broker_test.go index 5ba542724f..9123c456fc 100644 --- a/agent/client/mock_service_info_broker_test.go +++ b/agent/client/mock_service_info_broker_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package client diff --git a/managed/services/inventory/mock_service_info_broker_test.go b/managed/services/inventory/mock_service_info_broker_test.go index b6fbba42fd..b3e711ade0 100644 --- a/managed/services/inventory/mock_service_info_broker_test.go +++ b/managed/services/inventory/mock_service_info_broker_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package inventory diff --git a/managed/services/management/mock_service_info_broker_test.go b/managed/services/management/mock_service_info_broker_test.go index 1026c5ff78..c626e893d4 100644 --- a/managed/services/management/mock_service_info_broker_test.go +++ b/managed/services/management/mock_service_info_broker_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package management From e086b74fdbb43132d1acf3ab3f2dd5e2d8425c3f Mon Sep 17 00:00:00 2001 From: Alex Demidoff Date: Fri, 20 Oct 2023 18:45:08 +0000 Subject: [PATCH 40/41] PMM-12375 remove debug msg --- managed/services/agents/service_info_broker.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/managed/services/agents/service_info_broker.go b/managed/services/agents/service_info_broker.go index 797a1943fb..5a2eea3b99 100644 --- a/managed/services/agents/service_info_broker.go +++ b/managed/services/agents/service_info_broker.go @@ -142,8 +142,6 @@ func (c *ServiceInfoBroker) GetInfoFromService(ctx context.Context, q *reform.Qu pmmAgentID := pointer.GetString(agent.PMMAgentID) isSibSupported, err := isServiceInfoBrokerSupported(q, pmmAgentID) - l.Warnf("ServiceInfoBroker supported: %t.", isSibSupported) - if err != nil { return err } From 635ea400262d313420998f063302df5589168de5 Mon Sep 17 00:00:00 2001 From: Nurlan Moldomurov Date: Tue, 24 Oct 2023 19:45:47 +0300 Subject: [PATCH 41/41] Fix linter --- managed/services/agents/service_info_broker.go | 1 - 1 file changed, 1 deletion(-) diff --git a/managed/services/agents/service_info_broker.go b/managed/services/agents/service_info_broker.go index 5a2eea3b99..c329a11266 100644 --- a/managed/services/agents/service_info_broker.go +++ b/managed/services/agents/service_info_broker.go @@ -141,7 +141,6 @@ func (c *ServiceInfoBroker) GetInfoFromService(ctx context.Context, q *reform.Qu pmmAgentID := pointer.GetString(agent.PMMAgentID) isSibSupported, err := isServiceInfoBrokerSupported(q, pmmAgentID) - if err != nil { return err }