diff --git a/src/cmd/cli/command/commands.go b/src/cmd/cli/command/commands.go index 6b571b953..6e4b88399 100644 --- a/src/cmd/cli/command/commands.go +++ b/src/cmd/cli/command/commands.go @@ -23,6 +23,7 @@ import ( "github.com/DefangLabs/defang/src/pkg/clouds/aws" pcluster "github.com/DefangLabs/defang/src/pkg/cluster" "github.com/DefangLabs/defang/src/pkg/dryrun" + "github.com/DefangLabs/defang/src/pkg/github" "github.com/DefangLabs/defang/src/pkg/login" "github.com/DefangLabs/defang/src/pkg/logs" "github.com/DefangLabs/defang/src/pkg/mcp" @@ -127,7 +128,7 @@ func Execute(ctx context.Context) error { } if hasTty && !hideUpdate && pkg.RandomIndex(10) == 0 { - if latest, err := GetLatestVersion(ctx); err == nil && isNewer(GetCurrentVersion(), latest) { + if latest, err := github.GetLatestReleaseTag(ctx); err == nil && isNewer(GetCurrentVersion(), latest) { term.Debug("Latest Version:", latest, "Current Version:", GetCurrentVersion()) fmt.Println("A newer version of the CLI is available at https://github.com/DefangLabs/defang/releases/latest") if pkg.RandomIndex(10) == 0 && !pkg.GetenvBool("DEFANG_HIDE_HINTS") { @@ -620,7 +621,7 @@ var getVersionCmd = &cobra.Command{ fmt.Println(GetCurrentVersion()) term.Printc(term.BrightCyan, "Latest CLI: ") - ver, err := GetLatestVersion(cmd.Context()) + ver, err := github.GetLatestReleaseTag(cmd.Context()) fmt.Println(ver) term.Printc(term.BrightCyan, "Defang Fabric: ") @@ -698,7 +699,7 @@ var configSetCmd = &cobra.Command{ value = strings.TrimSuffix(string(bytes), "\n") } else if random { // Generate a random value for the config - value = CreateRandomConfigValue() + value = cli.CreateRandomConfigValue() term.Info("Generated random value: " + value) } else { // Prompt for sensitive value diff --git a/src/cmd/cli/command/compose.go b/src/cmd/cli/command/compose.go index a7f55b7e6..a19a2288e 100644 --- a/src/cmd/cli/command/compose.go +++ b/src/cmd/cli/command/compose.go @@ -15,6 +15,7 @@ import ( cliClient "github.com/DefangLabs/defang/src/pkg/cli/client" "github.com/DefangLabs/defang/src/pkg/cli/client/byoc" "github.com/DefangLabs/defang/src/pkg/cli/compose" + pcluster "github.com/DefangLabs/defang/src/pkg/cluster" "github.com/DefangLabs/defang/src/pkg/dryrun" "github.com/DefangLabs/defang/src/pkg/logs" "github.com/DefangLabs/defang/src/pkg/modes" @@ -26,6 +27,19 @@ import ( "github.com/spf13/cobra" ) +const DEFANG_PORTAL_HOST = "portal.defang.io" +const SERVICE_PORTAL_URL = "https://" + DEFANG_PORTAL_HOST + "/service" + +func printPlaygroundPortalServiceURLs(serviceInfos []*defangv1.ServiceInfo) { + // We can only show services deployed to the prod1 defang SaaS environment. + if providerID == cliClient.ProviderDefang && cluster == pcluster.DefaultCluster { + term.Info("Monitor your services' status in the defang portal") + for _, serviceInfo := range serviceInfos { + term.Println(" -", SERVICE_PORTAL_URL+"/"+serviceInfo.Service.Name) + } + } +} + var logType = logs.LogTypeAll func makeComposeUpCmd() *cobra.Command { @@ -170,7 +184,7 @@ func makeComposeUpCmd() *cobra.Command { } // Print the current service states of the deployment - err = printServiceStatesAndEndpoints(deploy.Services) + err = cli.PrintServiceStatesAndEndpoints(ctx, deploy.Services) if err != nil { return err } diff --git a/src/cmd/cli/command/compose_test.go b/src/cmd/cli/command/compose_test.go index 8568c3ec1..1f14e0cbf 100644 --- a/src/cmd/cli/command/compose_test.go +++ b/src/cmd/cli/command/compose_test.go @@ -1,7 +1,14 @@ package command import ( + "bytes" + "os" "testing" + + cliClient "github.com/DefangLabs/defang/src/pkg/cli/client" + pcluster "github.com/DefangLabs/defang/src/pkg/cluster" + "github.com/DefangLabs/defang/src/pkg/term" + defangv1 "github.com/DefangLabs/defang/src/protos/io/defang/v1" ) func TestInitializeTailCmd(t *testing.T) { @@ -14,3 +21,26 @@ func TestInitializeTailCmd(t *testing.T) { } }) } + +func TestPrintPlaygroundPortalServiceURLs(t *testing.T) { + defaultTerm := term.DefaultTerm + t.Cleanup(func() { + term.DefaultTerm = defaultTerm + }) + + var stdout, stderr bytes.Buffer + term.DefaultTerm = term.NewTerm(os.Stdin, &stdout, &stderr) + + providerID = cliClient.ProviderDefang + cluster = pcluster.DefaultCluster + printPlaygroundPortalServiceURLs([]*defangv1.ServiceInfo{ + { + Service: &defangv1.Service{Name: "service1"}, + }}) + const want = ` * Monitor your services' status in the defang portal + - https://portal.defang.io/service/service1 +` + if got := stdout.String(); got != want { + t.Errorf("got %q, want %q", got, want) + } +} diff --git a/src/cmd/cli/command/deploymentinfo.go b/src/cmd/cli/command/deploymentinfo.go deleted file mode 100644 index 28b58df8c..000000000 --- a/src/cmd/cli/command/deploymentinfo.go +++ /dev/null @@ -1,86 +0,0 @@ -package command - -import ( - "regexp" - "strings" - - cliClient "github.com/DefangLabs/defang/src/pkg/cli/client" - pcluster "github.com/DefangLabs/defang/src/pkg/cluster" - "github.com/DefangLabs/defang/src/pkg/term" - defangv1 "github.com/DefangLabs/defang/src/protos/io/defang/v1" -) - -const DEFANG_PORTAL_HOST = "portal.defang.io" -const SERVICE_PORTAL_URL = "https://" + DEFANG_PORTAL_HOST + "/service" - -func printPlaygroundPortalServiceURLs(serviceInfos []*defangv1.ServiceInfo) { - // We can only show services deployed to the prod1 defang SaaS environment. - if providerID == cliClient.ProviderDefang && cluster == pcluster.DefaultCluster { - term.Info("Monitor your services' status in the defang portal") - for _, serviceInfo := range serviceInfos { - term.Println(" -", SERVICE_PORTAL_URL+"/"+serviceInfo.Service.Name) - } - } -} - -type ServiceTableItem struct { - Deployment string `json:"Deployment"` - Status string `json:"Status"` - Name string `json:"Name"` - DomainName string `json:"DomainName"` - Endpoints string `json:"Endpoints"` -} - -func printServiceStatesAndEndpoints(serviceInfos []*defangv1.ServiceInfo) error { - serviceTableItems := make([]ServiceTableItem, 0, len(serviceInfos)) - - showDomainNameColumn := false - showCertGenerateHint := false - hasPort := regexp.MustCompile(`:\d{1,5}$`) - - for _, serviceInfo := range serviceInfos { - var domainname string - if serviceInfo.Domainname != "" { - showDomainNameColumn = true - domainname = "https://" + serviceInfo.Domainname - if serviceInfo.ZoneId == "" { - showCertGenerateHint = true - } - } - endpoints := make([]string, 0, len(serviceInfo.Endpoints)) - for _, endpoint := range serviceInfo.Endpoints { - if !hasPort.MatchString(endpoint) { - endpoint = "https://" + endpoint - } - - endpoints = append(endpoints, endpoint) - } - if len(endpoints) == 0 { - endpoints = append(endpoints, "N/A") - } - - serviceTableItems = append(serviceTableItems, ServiceTableItem{ - Deployment: serviceInfo.Etag, - Name: serviceInfo.Service.Name, - Status: serviceInfo.State.String(), - DomainName: domainname, - Endpoints: strings.Join(endpoints, ", "), - }) - } - - attrs := []string{"Deployment", "Name", "Status", "Endpoints"} - if showDomainNameColumn { - attrs = append(attrs, "DomainName") - } - - err := term.Table(serviceTableItems, attrs...) - if err != nil { - return err - } - - if showCertGenerateHint { - term.Info("Run `defang cert generate` to get a TLS certificate for your service(s)") - } - - return nil -} diff --git a/src/cmd/cli/command/version.go b/src/cmd/cli/command/version.go index 8d44f1e1e..4d6508d2d 100644 --- a/src/cmd/cli/command/version.go +++ b/src/cmd/cli/command/version.go @@ -1,14 +1,8 @@ package command import ( - "context" - "encoding/json" - "fmt" - "os" "strings" - "github.com/DefangLabs/defang/src/pkg/http" - "github.com/DefangLabs/defang/src/pkg/term" "golang.org/x/mod/semver" ) @@ -36,44 +30,3 @@ func GetCurrentVersion() string { version, _ := normalizeVersion(RootCmd.Version) return version } - -type githubError struct { - Message string - Status string - DocumentationUrl string -} - -func GetLatestVersion(ctx context.Context) (string, error) { - // Anonymous API request to GitHub are rate limited to 60 requests per hour per IP. - // Check whether the user has set a GitHub token to increase the rate limit. (Copied from the install script.) - githubToken := os.Getenv("GITHUB_TOKEN") - if githubToken == "" { - githubToken = os.Getenv("GH_TOKEN") - } - header := http.Header{} - if githubToken != "" { - header["Authorization"] = []string{"Bearer " + githubToken} - } - resp, err := http.GetWithHeader(ctx, "https://api.github.com/repos/DefangLabs/defang/releases/latest", header) - if err != nil { - return "", err - } - defer resp.Body.Close() - if resp.StatusCode != 200 { - term.Debug(resp.Header) - // The primary rate limit for unauthenticated requests is 60 requests per hour, per IP. - // The API returns a 403 status code when the rate limit is exceeded. - githubError := githubError{Message: resp.Status} - if err := json.NewDecoder(resp.Body).Decode(&githubError); err != nil { - term.Debugf("Failed to decode GitHub response: %v", err) - } - return "", fmt.Errorf("error fetching release info from GitHub: %s", githubError.Message) - } - var release struct { - TagName string `json:"tag_name"` - } - if err = json.NewDecoder(resp.Body).Decode(&release); err != nil { - return "", err - } - return release.TagName, nil -} diff --git a/src/cmd/cli/command/version_test.go b/src/cmd/cli/command/version_test.go index c943671d1..d87cb1721 100644 --- a/src/cmd/cli/command/version_test.go +++ b/src/cmd/cli/command/version_test.go @@ -3,10 +3,7 @@ package command import ( "fmt" "net/http" - "net/http/httptest" "testing" - - ourHttp "github.com/DefangLabs/defang/src/pkg/http" ) func TestIsNewer(t *testing.T) { @@ -67,40 +64,3 @@ func (rt *mockRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) } return rt.resp, nil } - -func TestGetLatestVersion(t *testing.T) { - if testing.Short() { - t.Skip("skipping GitHub HTTP test in short mode to avoid rate limits.") - } - - ctx := t.Context() - - const version = "v1.2.3" - rec := httptest.NewRecorder() - rec.Header().Add("Content-Type", "application/json") - rec.WriteString(fmt.Sprintf(`{"tag_name":"%v"}`, version)) - response := rec.Result() - - client := ourHttp.DefaultClient - t.Cleanup(func() { - ourHttp.DefaultClient = client - response.Body.Close() - }) - - ourHttp.DefaultClient = &http.Client{Transport: &mockRoundTripper{ - method: http.MethodGet, - url: "https://api.github.com/repos/DefangLabs/defang/releases/latest", - resp: response, - }} - - v, err := GetLatestVersion(ctx) - if err != nil { - t.Fatalf("GetLatestVersion() error = %v; want nil", err) - } - if v == "" { - t.Fatalf("GetLatestVersion() = %v; want non-empty", v) - } - if v != version { - t.Errorf("GetLatestVersion() = %v; want %v", v, version) - } -} diff --git a/src/pkg/cli/client/byoc/aws/byoc.go b/src/pkg/cli/client/byoc/aws/byoc.go index 02717b10b..2aebe72a0 100644 --- a/src/pkg/cli/client/byoc/aws/byoc.go +++ b/src/pkg/cli/client/byoc/aws/byoc.go @@ -19,6 +19,7 @@ import ( "github.com/DefangLabs/defang/src/pkg/cli/client/byoc" "github.com/DefangLabs/defang/src/pkg/cli/compose" "github.com/DefangLabs/defang/src/pkg/clouds/aws" + "github.com/DefangLabs/defang/src/pkg/clouds/aws/cw" "github.com/DefangLabs/defang/src/pkg/clouds/aws/ecs" "github.com/DefangLabs/defang/src/pkg/clouds/aws/ecs/cfn" "github.com/DefangLabs/defang/src/pkg/dns" @@ -383,16 +384,19 @@ func (b *ByocAws) environment(projectName string) (map[string]string, error) { "DEFANG_JSON": os.Getenv("DEFANG_JSON"), "DEFANG_ORG": b.TenantName, "DEFANG_PREFIX": byoc.DefangPrefix, + "DEFANG_PREVIEW": "true", // always preview HACK "DEFANG_STATE_URL": defangStateUrl, "NODE_NO_WARNINGS": "1", "NPM_CONFIG_UPDATE_NOTIFIER": "false", "PRIVATE_DOMAIN": byoc.GetPrivateDomain(projectName), - "PROJECT": projectName, // may be empty - pulumiBackendKey: pulumiBackendValue, // TODO: make secret - "PULUMI_CONFIG_PASSPHRASE": byoc.PulumiConfigPassphrase, // TODO: make secret - "PULUMI_COPILOT": "false", - "PULUMI_SKIP_UPDATE_CHECK": "true", - "STACK": b.PulumiStack, + "PROJECT": projectName, // may be empty + pulumiBackendKey: pulumiBackendValue, // TODO: make secret + "PULUMI_AUTOMATION_API_SKIP_VERSION_CHECK": "true", + "PULUMI_CONFIG_PASSPHRASE": byoc.PulumiConfigPassphrase, // TODO: make secret + "PULUMI_COPILOT": "false", + "PULUMI_DIY_BACKEND_DISABLE_CHECKPOINT_BACKUPS": "true", // versioned bucket is used + "PULUMI_SKIP_UPDATE_CHECK": "true", + "STACK": b.PulumiStack, } if !term.StdoutCanColor() { @@ -533,6 +537,50 @@ func (b *ByocAws) GetServices(ctx context.Context, req *defangv1.GetServicesRequ listServiceResp.Project = projUpdate.Project } + /*if len(listServiceResp.Services) > 0 { + cfg, err := b.driver.LoadConfig(ctx) + if err != nil { + return nil, AnnotateAwsError(err) + } + + ecsClient := awsecs.NewFromConfig(cfg) // Ensure the ECS client is initialized + lso, err := ecsClient.ListServices(ctx, &awsecs.ListServicesInput{ + Cluster: ptr.String(b.driver.ClusterName), + MaxResults: ptr.Int32(100), // 100=maximum + }) + if err != nil { + return nil, AnnotateAwsError(err) + } + + var services []string + for _, service := range listServiceResp.Services { + // Find the physical service name + for _, ecsService := range lso.ServiceArns { + if strings.HasSuffix(*ecsService, service.Service.Name) { + // The physical service name is the one with the Pulumi suffix + services = append(services, service.Service.Name) //this is wrong, since the physical name has the Pulumi suffix + } + dso, err := ecsClient.DescribeServices(ctx, &awsecs.DescribeServicesInput{ + Cluster: ptr.String(b.driver.ClusterName), + Services: services, + }) + if err != nil { + return nil, AnnotateAwsError(err) + } + bytes, _ := json.Marshal(dso) + term.Debug(string(bytes)) + for _, service := range projUpdate.Services { + for _, ecsService := range dso.Services { + if *ecsService.ServiceName != service.Service.Name { + continue + } + ecsService.Deployments[0]. + service.Status = *ecsService.Status + break + } + } + }*/ + return &listServiceResp, nil } @@ -612,7 +660,7 @@ func (b *ByocAws) QueryForDebug(ctx context.Context, req *defangv1.DebugRequest) } // Gather logs from the CD task, kaniko, ECS events, and all services - evtsChan, errsChan := ecs.QueryLogGroups(ctx, start, end, 0, b.getLogGroupInputs(req.Etag, req.Project, service, "", logs.LogTypeAll)...) + evtsChan, errsChan := cw.QueryLogGroups(ctx, start, end, 0, b.getLogGroupInputs(req.Etag, req.Project, service, "", logs.LogTypeAll)...) if evtsChan == nil { return <-errsChan } @@ -676,7 +724,7 @@ func (b *ByocAws) QueryLogs(ctx context.Context, req *defangv1.TailRequest) (cli // * No Etag, service: tail all tasks/services with that service name // * Etag, service: tail that task/service var err error - var tailStream ecs.LiveTailStream + var tailStream cw.LiveTailStream if etag != "" && !pkg.IsValidRandomID(etag) { // Assume invalid "etag" is a task ID if req.Follow { @@ -706,14 +754,14 @@ func (b *ByocAws) QueryLogs(ctx context.Context, req *defangv1.TailRequest) (cli } lgis := b.getLogGroupInputs(etag, req.Project, service, req.Pattern, logs.LogType(req.LogType)) if req.Follow { - tailStream, err = ecs.QueryAndTailLogGroups( + tailStream, err = cw.QueryAndTailLogGroups( ctx, start, end, lgis..., ) } else { - evtsChan, errsChan := ecs.QueryLogGroups( + evtsChan, errsChan := cw.QueryLogGroups( ctx, start, end, @@ -723,7 +771,7 @@ func (b *ByocAws) QueryLogs(ctx context.Context, req *defangv1.TailRequest) (cli if evtsChan == nil { err = <-errsChan } else { - tailStream = ecs.NewStaticLogStream(evtsChan, func() {}) + tailStream = cw.NewStaticLogStream(evtsChan, func() {}) } } } @@ -739,7 +787,7 @@ func (b *ByocAws) makeLogGroupARN(name string) string { return b.driver.MakeARN("logs", "log-group:"+name) } -func (b *ByocAws) getLogGroupInputs(etag types.ETag, projectName, service, filter string, logType logs.LogType) []ecs.LogGroupInput { +func (b *ByocAws) getLogGroupInputs(etag types.ETag, projectName, service, filter string, logType logs.LogType) []cw.LogGroupInput { // Escape the filter pattern to avoid problems with the CloudWatch Logs pattern syntax // See https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/FilterAndPatternSyntax.html var pattern string // TODO: add etag to filter @@ -747,26 +795,26 @@ func (b *ByocAws) getLogGroupInputs(etag types.ETag, projectName, service, filte pattern = strconv.Quote(filter) } - var groups []ecs.LogGroupInput + var groups []cw.LogGroupInput // Tail CD and kaniko if logType.Has(logs.LogTypeBuild) { - cdTail := ecs.LogGroupInput{LogGroupARN: b.driver.LogGroupARN, LogEventFilterPattern: pattern} // TODO: filter by etag + cdTail := cw.LogGroupInput{LogGroupARN: b.driver.LogGroupARN, LogEventFilterPattern: pattern} // TODO: filter by etag // If we know the CD task ARN, only tail the logstream for that CD task if b.cdTaskArn != nil && b.cdEtag == etag { cdTail.LogStreamNames = []string{ecs.GetCDLogStreamForTaskID(ecs.GetTaskID(b.cdTaskArn))} } groups = append(groups, cdTail) term.Debug("Query CD logs", cdTail.LogGroupARN, cdTail.LogStreamNames, filter) - kanikoTail := ecs.LogGroupInput{LogGroupARN: b.makeLogGroupARN(b.StackDir(projectName, "builds")), LogEventFilterPattern: pattern} // must match logic in ecs/common.ts; TODO: filter by etag/service + kanikoTail := cw.LogGroupInput{LogGroupARN: b.makeLogGroupARN(b.StackDir(projectName, "builds")), LogEventFilterPattern: pattern} // must match logic in ecs/common.ts; TODO: filter by etag/service term.Debug("Query kaniko logs", kanikoTail.LogGroupARN, filter) groups = append(groups, kanikoTail) - ecsTail := ecs.LogGroupInput{LogGroupARN: b.makeLogGroupARN(b.StackDir(projectName, "ecs")), LogEventFilterPattern: pattern} // must match logic in ecs/common.ts; TODO: filter by etag/service/deploymentId + ecsTail := cw.LogGroupInput{LogGroupARN: b.makeLogGroupARN(b.StackDir(projectName, "ecs")), LogEventFilterPattern: pattern} // must match logic in ecs/common.ts; TODO: filter by etag/service/deploymentId term.Debug("Query ecs events logs", ecsTail.LogGroupARN, filter) groups = append(groups, ecsTail) } // Tail services if logType.Has(logs.LogTypeRun) { - servicesTail := ecs.LogGroupInput{LogGroupARN: b.makeLogGroupARN(b.StackDir(projectName, "logs")), LogEventFilterPattern: pattern} // must match logic in ecs/common.ts + servicesTail := cw.LogGroupInput{LogGroupARN: b.makeLogGroupARN(b.StackDir(projectName, "logs")), LogEventFilterPattern: pattern} // must match logic in ecs/common.ts if service != "" && etag != "" { servicesTail.LogStreamNamePrefix = service + "/" + service + "_" + etag } diff --git a/src/pkg/cli/client/byoc/aws/byoc_integration_test.go b/src/pkg/cli/client/byoc/aws/byoc_integration_test.go index f6d016e5d..9671c0930 100644 --- a/src/pkg/cli/client/byoc/aws/byoc_integration_test.go +++ b/src/pkg/cli/client/byoc/aws/byoc_integration_test.go @@ -19,17 +19,6 @@ func TestDeploy(t *testing.T) { _, err := b.Deploy(context.Background(), &defangv1.DeployRequest{ Project: "byoc_integration_test", - Services: []*defangv1.Service{{ - Name: "test", - Image: "docker.io/library/nginx:latest", - Ports: []*defangv1.Port{{ - Target: 80, - Mode: defangv1.Mode_INGRESS, - }, { - Target: 443, - Mode: defangv1.Mode_INGRESS, - }}, - }}, }) if err == nil || !strings.Contains(err.Error(), "duplicate endpoint:") { t.Error("expected error") diff --git a/src/pkg/cli/client/byoc/aws/stream.go b/src/pkg/cli/client/byoc/aws/stream.go index 2d0e898c1..e99bdcac0 100644 --- a/src/pkg/cli/client/byoc/aws/stream.go +++ b/src/pkg/cli/client/byoc/aws/stream.go @@ -11,6 +11,7 @@ import ( "github.com/DefangLabs/defang/src/pkg" "github.com/DefangLabs/defang/src/pkg/cli/client" "github.com/DefangLabs/defang/src/pkg/cli/client/byoc" + "github.com/DefangLabs/defang/src/pkg/clouds/aws/cw" "github.com/DefangLabs/defang/src/pkg/clouds/aws/ecs" "github.com/DefangLabs/defang/src/pkg/logs" "github.com/DefangLabs/defang/src/pkg/term" @@ -26,12 +27,12 @@ type byocServerStream struct { etag string response *defangv1.TailResponse services []string - stream ecs.LiveTailStream + stream cw.LiveTailStream ecsEventsHandler ECSEventHandler } -func newByocServerStream(stream ecs.LiveTailStream, etag string, services []string, ecsEventHandler ECSEventHandler) *byocServerStream { +func newByocServerStream(stream cw.LiveTailStream, etag string, services []string, ecsEventHandler ECSEventHandler) *byocServerStream { return &byocServerStream{ etag: etag, stream: stream, @@ -64,7 +65,7 @@ func (bs *byocServerStream) Receive() bool { bs.err = AnnotateAwsError(err) return false } - evts, err := ecs.GetLogEvents(e) + evts, err := cw.GetLogEvents(e) if err != nil { bs.err = err return false @@ -73,7 +74,7 @@ func (bs *byocServerStream) Receive() bool { return true } -func (bs *byocServerStream) parseEvents(events []ecs.LogEvent) *defangv1.TailResponse { +func (bs *byocServerStream) parseEvents(events []cw.LogEvent) *defangv1.TailResponse { if len(events) == 0 { // The original gRPC/connect server stream would never send an empty response. // We could loop around the select, but returning an empty response updates the spinner. diff --git a/src/pkg/cli/client/byoc/aws/stream_test.go b/src/pkg/cli/client/byoc/aws/stream_test.go index aef21d229..12b07e971 100644 --- a/src/pkg/cli/client/byoc/aws/stream_test.go +++ b/src/pkg/cli/client/byoc/aws/stream_test.go @@ -4,7 +4,7 @@ import ( "testing" "time" - "github.com/DefangLabs/defang/src/pkg/clouds/aws/ecs" + "github.com/DefangLabs/defang/src/pkg/clouds/aws/cw" defangv1 "github.com/DefangLabs/defang/src/protos/io/defang/v1" "github.com/stretchr/testify/assert" "google.golang.org/protobuf/types/known/timestamppb" @@ -22,12 +22,12 @@ func ptrInt64(i int64) *int64 { func TestStreamToLogEvent(t *testing.T) { var testEtag = "hg2xsgvsldqk" var testdata = []struct { - event *ecs.LogEvent + event *cw.LogEvent wantResp *defangv1.TailResponse }{ { // cd message - event: &ecs.LogEvent{ + event: &cw.LogEvent{ IngestionTime: ptrInt64(1761883448306), LogGroupIdentifier: ptrString("532501343364:defang-cd-LogGroup-8id1W5WpeWRu"), LogStreamName: ptrString("crun/main/127bb61dd5f746918f578f32cc1d6d01"), @@ -48,7 +48,7 @@ func TestStreamToLogEvent(t *testing.T) { }, { // error message - event: &ecs.LogEvent{ + event: &cw.LogEvent{ IngestionTime: ptrInt64(1761883448306), LogGroupIdentifier: ptrString("532501343364:defang-cd-LogGroup-8id1W5WpeWRu"), LogStreamName: ptrString("crun/main/127bb61dd5f746918f578f32cc1d6d01"), @@ -69,7 +69,7 @@ func TestStreamToLogEvent(t *testing.T) { }, { // service message - event: &ecs.LogEvent{ + event: &cw.LogEvent{ IngestionTime: ptrInt64(1761883448306), LogGroupIdentifier: ptrString("532501343364:/Defang/django/beta/builds"), LogStreamName: ptrString("django-image/django_hg2xsgvsldqk/fb1d2a8e-9553-497e-85e4-91a57f8b6ba6"), @@ -90,7 +90,7 @@ func TestStreamToLogEvent(t *testing.T) { }, { // ECS message - event: &ecs.LogEvent{ + event: &cw.LogEvent{ IngestionTime: ptrInt64(1761883448306), LogGroupIdentifier: ptrString("532501343364:/Defang/django/beta/ecs"), LogStreamName: ptrString("7127bdd6-6e73-3d4e-8c97-18c3071004af"), @@ -101,7 +101,7 @@ func TestStreamToLogEvent(t *testing.T) { }, { // railpack message - event: &ecs.LogEvent{ + event: &cw.LogEvent{ IngestionTime: ptrInt64(1762148772888), LogGroupIdentifier: ptrString("532501343364:defang-cd-LogGroup-8id1W5WpeWRu"), LogStreamName: ptrString("crun/main/a467a0afd56d44baab32bb5cceb10da0"), @@ -122,7 +122,7 @@ func TestStreamToLogEvent(t *testing.T) { }, { // service message - event: &ecs.LogEvent{ + event: &cw.LogEvent{ IngestionTime: ptrInt64(1762144097682), LogGroupIdentifier: ptrString("532501343364:/Defang/django6/beta/logs"), LogStreamName: ptrString("django/django_hg2xsgvsldqk/b89c0f0e35ad4357852f0d7cafd488eb"), @@ -146,7 +146,7 @@ func TestStreamToLogEvent(t *testing.T) { var byocServiceStream = newByocServerStream(nil, testEtag, []string{"cd", "app", "django"}, nil) for _, td := range testdata { - tailResp := byocServiceStream.parseEvents([]ecs.LogEvent{*td.event}) + tailResp := byocServiceStream.parseEvents([]cw.LogEvent{*td.event}) if (td.wantResp == nil) != (tailResp == nil) { t.Errorf("nil mismatch: expected %v, got %v", td.wantResp, tailResp) continue diff --git a/src/pkg/cli/client/byoc/baseclient.go b/src/pkg/cli/client/byoc/baseclient.go index f6045f091..ff07efe89 100644 --- a/src/pkg/cli/client/byoc/baseclient.go +++ b/src/pkg/cli/client/byoc/baseclient.go @@ -226,14 +226,6 @@ func (b *ByocBaseClient) update(ctx context.Context, projectName, delegateDomain hasIngress = hasIngress || port.Mode == compose.Mode_INGRESS hasHost = hasHost || port.Mode == compose.Mode_HOST si.Endpoints = append(si.Endpoints, b.GetEndpoint(fqn, projectName, delegateDomain, &port)) - mode := defangv1.Mode_INGRESS - if port.Mode == compose.Mode_HOST { - mode = defangv1.Mode_HOST - } - si.Service.Ports = append(si.Service.Ports, &defangv1.Port{ - Target: port.Target, - Mode: mode, - }) } } else { si.PublicFqdn = b.GetPublicFqdn(projectName, delegateDomain, fqn) diff --git a/src/pkg/cli/compose/fixup.go b/src/pkg/cli/compose/fixup.go index 95d08564e..b14b917b6 100644 --- a/src/pkg/cli/compose/fixup.go +++ b/src/pkg/cli/compose/fixup.go @@ -114,8 +114,8 @@ func FixupServices(ctx context.Context, provider client.Provider, project *compo } } - // Pack the build context into a Archive and upload if !strings.Contains(svccfg.Build.Context, "://") { + // Pack the build context into a Archive and upload url, err := getRemoteBuildContext(ctx, provider, project.Name, svccfg.Name, svccfg.Build, upload) if err != nil { return err diff --git a/src/pkg/cli/composeUp_test.go b/src/pkg/cli/composeUp_test.go index fb873faac..366e11967 100644 --- a/src/pkg/cli/composeUp_test.go +++ b/src/pkg/cli/composeUp_test.go @@ -29,8 +29,8 @@ func (d mockDeployProvider) Deploy(ctx context.Context, req *defangv1.DeployRequ } func (mockDeployProvider) Preview(ctx context.Context, req *defangv1.DeployRequest) (*defangv1.DeployResponse, error) { - if req.Compose == nil && req.Services == nil { - return nil, errors.New("DeployRequest needs Compose or Services") + if len(req.Compose) == 0 { + return nil, errors.New("DeployRequest needs Compose") } project, err := compose.LoadFromContent(ctx, req.Compose, "") diff --git a/src/cmd/cli/command/configrandom.go b/src/pkg/cli/configrandom.go similarity index 95% rename from src/cmd/cli/command/configrandom.go rename to src/pkg/cli/configrandom.go index c46cfe6d0..a9ce329dd 100644 --- a/src/cmd/cli/command/configrandom.go +++ b/src/pkg/cli/configrandom.go @@ -1,4 +1,4 @@ -package command +package cli import ( "crypto/rand" diff --git a/src/cmd/cli/command/configrandom_test.go b/src/pkg/cli/configrandom_test.go similarity index 99% rename from src/cmd/cli/command/configrandom_test.go rename to src/pkg/cli/configrandom_test.go index b8af853ba..4b7189ef8 100644 --- a/src/cmd/cli/command/configrandom_test.go +++ b/src/pkg/cli/configrandom_test.go @@ -1,4 +1,4 @@ -package command +package cli import ( "testing" diff --git a/src/pkg/cli/deploymentinfo.go b/src/pkg/cli/deploymentinfo.go new file mode 100644 index 000000000..63eae92a2 --- /dev/null +++ b/src/pkg/cli/deploymentinfo.go @@ -0,0 +1,114 @@ +package cli + +import ( + "context" + "net/http" + "strings" + "sync" + "time" + + "github.com/DefangLabs/defang/src/pkg/term" + defangv1 "github.com/DefangLabs/defang/src/protos/io/defang/v1" +) + +type printService struct { + Deployment string + Endpoint string + Service string + State defangv1.ServiceState + Status string + Fqdn string +} + +func PrintServiceStatesAndEndpoints(ctx context.Context, serviceInfos []*defangv1.ServiceInfo) error { + var serviceTableItems []*printService + + // showDomainNameColumn := false + showCertGenerateHint := false + + // Create a context with a timeout for HTTP requests + ctx, cancel := context.WithTimeout(ctx, 5*time.Second) + defer cancel() + var wg sync.WaitGroup + + for _, serviceInfo := range serviceInfos { + fqdn := serviceInfo.PublicFqdn + if fqdn == "" { + fqdn = serviceInfo.PrivateFqdn + } + domainname := "N/A" + if serviceInfo.Domainname != "" { + // showDomainNameColumn = true + domainname = "https://" + serviceInfo.Domainname + if serviceInfo.UseAcmeCert { + showCertGenerateHint = true + } + } else if serviceInfo.PublicFqdn != "" { + domainname = "https://" + serviceInfo.PublicFqdn + } else if serviceInfo.PrivateFqdn != "" { + domainname = serviceInfo.PrivateFqdn + } + + ps := &printService{ + Deployment: serviceInfo.Etag, + Service: serviceInfo.Service.Name, + State: serviceInfo.State, + Status: serviceInfo.Status, + Endpoint: domainname, + Fqdn: fqdn, + } + + if len(serviceInfo.Endpoints) == 0 { + serviceTableItems = append(serviceTableItems, ps) + continue + } + + for i, endpoint := range serviceInfo.Endpoints { + if i > 0 { + ps = &printService{} + } + ps.Endpoint = endpoint + if !strings.Contains(endpoint, ":") { + ps.Endpoint = "https://" + endpoint + + wg.Add(1) + go func(ps *printService) { + defer wg.Done() + url := ps.Endpoint + serviceInfo.Healthcheck + // Use the regular net/http package to make the request without retries + req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) + if err != nil { + ps.Status = err.Error() + return + } + resp, err := http.DefaultClient.Do(req) + if err != nil { + ps.Status = err.Error() + return + } + defer resp.Body.Close() + ps.Status = resp.Status + }(ps) + } + + serviceTableItems = append(serviceTableItems, ps) + } + } + wg.Wait() + + attrs := []string{"Service", "Deployment", "State", "Fqdn", "Endpoint", "Status"} + // if showDomainNameColumn { + // attrs = append(attrs, "DomainName") + // } + + err := term.Table(serviceTableItems, attrs...) + if err != nil { + return err + } + + if showCertGenerateHint { + term.Info("Run `defang cert generate` to get a TLS certificate for your service(s)") + } + + return nil +} diff --git a/src/cmd/cli/command/deploymentinfo_test.go b/src/pkg/cli/deploymentinfo_test.go similarity index 57% rename from src/cmd/cli/command/deploymentinfo_test.go rename to src/pkg/cli/deploymentinfo_test.go index 55e32208c..85c04b725 100644 --- a/src/cmd/cli/command/deploymentinfo_test.go +++ b/src/pkg/cli/deploymentinfo_test.go @@ -1,40 +1,16 @@ -package command +package cli import ( "bytes" + "context" "os" "strings" "testing" - cliClient "github.com/DefangLabs/defang/src/pkg/cli/client" - pcluster "github.com/DefangLabs/defang/src/pkg/cluster" "github.com/DefangLabs/defang/src/pkg/term" defangv1 "github.com/DefangLabs/defang/src/protos/io/defang/v1" ) -func TestPrintPlaygroundPortalServiceURLs(t *testing.T) { - defaultTerm := term.DefaultTerm - t.Cleanup(func() { - term.DefaultTerm = defaultTerm - }) - - var stdout, stderr bytes.Buffer - term.DefaultTerm = term.NewTerm(os.Stdin, &stdout, &stderr) - - providerID = cliClient.ProviderDefang - cluster = pcluster.DefaultCluster - printPlaygroundPortalServiceURLs([]*defangv1.ServiceInfo{ - { - Service: &defangv1.Service{Name: "service1"}, - }}) - const want = ` * Monitor your services' status in the defang portal - - https://portal.defang.io/service/service1 -` - if got := stdout.String(); got != want { - t.Errorf("got %q, want %q", got, want) - } -} - func TestPrintServiceStatesAndEndpointsAndDomainname(t *testing.T) { defaultTerm := term.DefaultTerm t.Cleanup(func() { @@ -55,10 +31,6 @@ func TestPrintServiceStatesAndEndpointsAndDomainname(t *testing.T) { { Service: &defangv1.Service{ Name: "service1", - Ports: []*defangv1.Port{ - {Mode: defangv1.Mode_INGRESS}, - {Mode: defangv1.Mode_HOST}, - }, }, Status: "UNKNOWN", Domainname: "example.com", @@ -66,8 +38,8 @@ func TestPrintServiceStatesAndEndpointsAndDomainname(t *testing.T) { }, }, expectedLines: []string{ - "DEPLOYMENT NAME STATUS ENDPOINTS DOMAINNAME", - " service1 NOT_SPECIFIED N/A https://example.com", + "SERVICE DEPLOYMENT STATUS ENDPOINTS DOMAINNAME", + "service1 NOT_SPECIFIED N/A https://example.com", " * Run `defang cert generate` to get a TLS certificate for your service(s)", "", }, @@ -78,10 +50,6 @@ func TestPrintServiceStatesAndEndpointsAndDomainname(t *testing.T) { { Service: &defangv1.Service{ Name: "service1", - Ports: []*defangv1.Port{ - {Mode: defangv1.Mode_INGRESS}, - {Mode: defangv1.Mode_HOST}, - }, }, Status: "UNKNOWN", Domainname: "example.com", @@ -92,8 +60,9 @@ func TestPrintServiceStatesAndEndpointsAndDomainname(t *testing.T) { }, }, expectedLines: []string{ - "DEPLOYMENT NAME STATUS ENDPOINTS DOMAINNAME", - " service1 NOT_SPECIFIED https://example.com, service1.internal:80 https://example.com", + "SERVICE DEPLOYMENT STATUS ENDPOINTS DOMAINNAME", + "service1 NOT_SPECIFIED https://example.com https://example.com", + "service1 NOT_SPECIFIED service1.internal:80 https://example.com", " * Run `defang cert generate` to get a TLS certificate for your service(s)", "", }, @@ -104,10 +73,6 @@ func TestPrintServiceStatesAndEndpointsAndDomainname(t *testing.T) { { Service: &defangv1.Service{ Name: "service1", - Ports: []*defangv1.Port{ - {Mode: defangv1.Mode_INGRESS}, - {Mode: defangv1.Mode_HOST}, - }, }, Status: "UNKNOWN", Endpoints: []string{ @@ -116,8 +81,8 @@ func TestPrintServiceStatesAndEndpointsAndDomainname(t *testing.T) { }, }, expectedLines: []string{ - "DEPLOYMENT NAME STATUS ENDPOINTS", - " service1 NOT_SPECIFIED https://service1", + "SERVICE DEPLOYMENT STATUS ENDPOINTS", + "service1 NOT_SPECIFIED https://service1", "", }, }, @@ -127,7 +92,7 @@ func TestPrintServiceStatesAndEndpointsAndDomainname(t *testing.T) { // Reset stdout before each test stdout.Reset() - _ = printServiceStatesAndEndpoints(tt.serviceinfos) + _ = PrintServiceStatesAndEndpoints(context.Background(), tt.serviceinfos) receivedLines := strings.Split(stdout.String(), "\n") if len(receivedLines) != len(tt.expectedLines) { diff --git a/src/pkg/cli/getServices.go b/src/pkg/cli/getServices.go index 10edf4786..52660ecdf 100644 --- a/src/pkg/cli/getServices.go +++ b/src/pkg/cli/getServices.go @@ -3,12 +3,10 @@ package cli import ( "context" "fmt" - "time" "github.com/DefangLabs/defang/src/pkg/cli/client" "github.com/DefangLabs/defang/src/pkg/term" defangv1 "github.com/DefangLabs/defang/src/protos/io/defang/v1" - "google.golang.org/protobuf/types/known/timestamppb" ) type ErrNoServices struct { @@ -16,13 +14,7 @@ type ErrNoServices struct { } func (e ErrNoServices) Error() string { - return fmt.Sprintf("no services found in project %q", e.ProjectName) -} - -type printService struct { - Service string - Deployment string - *defangv1.ServiceInfo + return fmt.Sprintf("no services found in project %s", e.ProjectName) } func GetServices(ctx context.Context, projectName string, provider client.Provider, long bool) error { @@ -34,33 +26,13 @@ func GetServices(ctx context.Context, projectName string, provider client.Provid } numServices := len(servicesResponse.Services) - if numServices == 0 { return ErrNoServices{ProjectName: projectName} } if long { - // Truncate nanoseconds from timestamps for readability. - services := make([]*defangv1.ServiceInfo, 0, len(servicesResponse.Services)) - for _, si := range servicesResponse.Services { - si.CreatedAt = timestamppb.New(si.CreatedAt.AsTime().Truncate(time.Second)) - services = append(services, si) - } - - servicesResponse.Services = services - servicesResponse.ExpiresAt = timestamppb.New(servicesResponse.ExpiresAt.AsTime().Truncate(time.Second)) return PrintObject("", servicesResponse) } - printServices := make([]printService, numServices) - for i, si := range servicesResponse.Services { - printServices[i] = printService{ - Service: si.Service.Name, - Deployment: si.Etag, - ServiceInfo: si, - } - servicesResponse.Services[i] = nil - } - - return term.Table(printServices, "Service", "Deployment", "PublicFqdn", "PrivateFqdn", "Status") + return PrintServiceStatesAndEndpoints(ctx, servicesResponse.Services) } diff --git a/src/pkg/cli/getServices_test.go b/src/pkg/cli/getServices_test.go index 72afbacfb..3305e21fd 100644 --- a/src/pkg/cli/getServices_test.go +++ b/src/pkg/cli/getServices_test.go @@ -40,7 +40,7 @@ func (mockGetServicesHandler) GetServices(ctx context.Context, req *connect.Requ Service: &defangv1.Service{ Name: "foo", }, - Endpoints: []string{}, + Endpoints: []string{"test-foo--3000.prod1.defang.dev"}, Project: "test", Etag: "a1b2c3", Status: "UNKNOWN", @@ -85,8 +85,8 @@ func TestGetServices(t *testing.T) { if err != nil { t.Fatalf("GetServices() error = %v", err) } - expectedOutput := "\x1b[1m\nSERVICE DEPLOYMENT PUBLICFQDN PRIVATEFQDN STATUS\x1b[0m" + ` -foo a1b2c3 test-foo.prod1.defang.dev UNKNOWN + expectedOutput := "\x1b[1m\nSERVICE DEPLOYMENT STATE FQDN STATUS\x1b[0m" + ` +foo a1b2c3 NOT_SPECIFIED test-foo.prod1.defang.dev 404 Not Found ` receivedLines := strings.Split(stdout.String(), "\n") @@ -123,6 +123,8 @@ foo a1b2c3 test-foo.prod1.defang.dev UNKNOWN "project: test\n" + "services:\n" + " - createdAt: \"2021-09-01T12:34:56Z\"\n" + + " endpoints:\n" + + " - test-foo--3000.prod1.defang.dev\n" + " etag: a1b2c3\n" + " project: test\n" + " publicFqdn: test-foo.prod1.defang.dev\n" + diff --git a/src/pkg/clouds/aws/ecs/logs.go b/src/pkg/clouds/aws/cw/logs.go similarity index 91% rename from src/pkg/clouds/aws/ecs/logs.go rename to src/pkg/clouds/aws/cw/logs.go index fde94f412..f8bdf7a1f 100644 --- a/src/pkg/clouds/aws/ecs/logs.go +++ b/src/pkg/clouds/aws/cw/logs.go @@ -1,4 +1,4 @@ -package ecs +package cw import ( "context" @@ -26,26 +26,6 @@ func getLogGroupIdentifier(arnOrId string) string { return strings.TrimSuffix(arnOrId, ":*") } -func NewStaticLogStream(ch <-chan LogEvent, cancel func()) EventStream[types.StartLiveTailResponseStream] { - es := &eventStream{ - cancel: cancel, - ch: make(chan types.StartLiveTailResponseStream), - } - - go func() { - defer close(es.ch) - for evt := range ch { - es.ch <- &types.StartLiveTailResponseStreamMemberSessionUpdate{ - Value: types.LiveTailSessionUpdate{ - SessionResults: []types.LiveTailSessionLogEvent{evt}, - }, - } - } - }() - - return es -} - func QueryAndTailLogGroups(ctx context.Context, start, end time.Time, logGroups ...LogGroupInput) (LiveTailStream, error) { ctx, cancel := context.WithCancel(ctx) @@ -159,6 +139,23 @@ func QueryLogGroup(ctx context.Context, input LogGroupInput, start, end time.Tim return filterLogEvents(ctx, cw, input, start, end, limit, cb) } +func QueryLogGroupStream(ctx context.Context, input LogGroupInput, start, end time.Time, limit int32) (EventStream[types.StartLiveTailResponseStream], error) { + ctx, cancel := context.WithCancel(ctx) + es := newEventStream(cancel) + + // TODO: this QueryLogGroup function doesn't return until all logs are fetched, so returning a stream is not very useful + if err := QueryLogGroup(ctx, input, start, end, limit, func(events []LogEvent) error { + es.ch <- &types.StartLiveTailResponseStreamMemberSessionUpdate{ + Value: types.LiveTailSessionUpdate{SessionResults: events}, + } + return nil + }); err != nil { + es.err = err + } + + return es, nil +} + func filterLogEvents(ctx context.Context, cw *cloudwatchlogs.Client, lgi LogGroupInput, start, end time.Time, limit int32, cb func([]LogEvent) error) error { var pattern *string if lgi.LogEventFilterPattern != "" { @@ -171,6 +168,9 @@ func filterLogEvents(ctx context.Context, cw *cloudwatchlogs.Client, lgi LogGrou FilterPattern: pattern, } + if limit != 0 { + params.Limit = &limit + } if !start.IsZero() { params.StartTime = ptr.Int64(start.UnixMilli()) } diff --git a/src/pkg/clouds/aws/ecs/logs_test.go b/src/pkg/clouds/aws/cw/logs_test.go similarity index 64% rename from src/pkg/clouds/aws/ecs/logs_test.go rename to src/pkg/clouds/aws/cw/logs_test.go index 6f86d1b31..9449746b3 100644 --- a/src/pkg/clouds/aws/ecs/logs_test.go +++ b/src/pkg/clouds/aws/cw/logs_test.go @@ -1,4 +1,4 @@ -package ecs +package cw import ( "testing" @@ -16,20 +16,6 @@ func TestLogGroupIdentifier(t *testing.T) { } } -func TestSplitClusterTask(t *testing.T) { - taskArn := "arn:aws:ecs:us-west-2:123456789012:task/cluster-name/12345678123412341234123456789012" - expectedClusterName := "cluster-name" - - clusterName, taskID := SplitClusterTask(&taskArn) - - if clusterName != expectedClusterName { - t.Errorf("Expected cluster name %q, but got %q", expectedClusterName, clusterName) - } - if taskID != "12345678123412341234123456789012" { - t.Errorf("Expected task ID %q, but got %q", taskArn, taskID) - } -} - func TestQueryAndTailLogGroups(t *testing.T) { e, err := QueryAndTailLogGroups(t.Context(), time.Now(), time.Time{}) if err != nil { diff --git a/src/pkg/clouds/aws/ecs/merge.go b/src/pkg/clouds/aws/cw/merge.go similarity index 98% rename from src/pkg/clouds/aws/ecs/merge.go rename to src/pkg/clouds/aws/cw/merge.go index 573fe6897..76672f0cd 100644 --- a/src/pkg/clouds/aws/ecs/merge.go +++ b/src/pkg/clouds/aws/cw/merge.go @@ -1,4 +1,4 @@ -package ecs +package cw // Inspired by https://dev.to/vinaygo/concurrency-merge-sort-using-channels-and-goroutines-in-golang-35f7 func Mergech[T any](left chan T, right chan T, c chan T, less func(T, T) bool) { diff --git a/src/pkg/clouds/aws/ecs/stream.go b/src/pkg/clouds/aws/cw/stream.go similarity index 87% rename from src/pkg/clouds/aws/ecs/stream.go rename to src/pkg/clouds/aws/cw/stream.go index e652b7263..8bb175767 100644 --- a/src/pkg/clouds/aws/ecs/stream.go +++ b/src/pkg/clouds/aws/cw/stream.go @@ -1,4 +1,4 @@ -package ecs +package cw import ( "context" @@ -135,3 +135,27 @@ func (es *eventStream) pipeEvents(ctx context.Context, tailStream LiveTailStream } } } + +func newEventStream(cancel func()) *eventStream { + return &eventStream{ + cancel: cancel, + ch: make(chan types.StartLiveTailResponseStream), + } +} + +func NewStaticLogStream(ch <-chan LogEvent, cancel func()) EventStream[types.StartLiveTailResponseStream] { + es := newEventStream(cancel) + + go func() { + defer close(es.ch) + for evt := range ch { + es.ch <- &types.StartLiveTailResponseStreamMemberSessionUpdate{ + Value: types.LiveTailSessionUpdate{ + SessionResults: []types.LiveTailSessionLogEvent{evt}, + }, + } + } + }() + + return es +} diff --git a/src/pkg/clouds/aws/ecs/stream_test.go b/src/pkg/clouds/aws/cw/stream_test.go similarity index 98% rename from src/pkg/clouds/aws/ecs/stream_test.go rename to src/pkg/clouds/aws/cw/stream_test.go index 8046a8270..74c564772 100644 --- a/src/pkg/clouds/aws/ecs/stream_test.go +++ b/src/pkg/clouds/aws/cw/stream_test.go @@ -1,6 +1,6 @@ //go:build integration -package ecs +package cw import ( "context" diff --git a/src/pkg/clouds/aws/ecs/event.go b/src/pkg/clouds/aws/ecs/event.go index 2935e8dfe..55cf7f3f7 100644 --- a/src/pkg/clouds/aws/ecs/event.go +++ b/src/pkg/clouds/aws/ecs/event.go @@ -236,11 +236,12 @@ func (e *KanikoTaskStateChangeEvent) Status() string { } var kanikoTaskStateMap = map[string]defangv1.ServiceState{ - // "STOPPED": defangv1.ServiceState_BUILD_STOPPING, // Ignored - "DEPROVISIONING": defangv1.ServiceState_BUILD_STOPPING, - "RUNNING": defangv1.ServiceState_BUILD_RUNNING, - "PENDING": defangv1.ServiceState_BUILD_PENDING, "PROVISIONING": defangv1.ServiceState_BUILD_PROVISIONING, + "PENDING": defangv1.ServiceState_BUILD_PENDING, + "ACTIVATING": defangv1.ServiceState_BUILD_ACTIVATING, + "RUNNING": defangv1.ServiceState_BUILD_RUNNING, + "DEPROVISIONING": defangv1.ServiceState_BUILD_STOPPING, + // "STOPPED": defangv1.ServiceState_BUILD_STOPPING, // Ignored } func (e *KanikoTaskStateChangeEvent) State() defangv1.ServiceState { diff --git a/src/pkg/clouds/aws/ecs/status_test.go b/src/pkg/clouds/aws/ecs/status_test.go new file mode 100644 index 000000000..99ced6ebc --- /dev/null +++ b/src/pkg/clouds/aws/ecs/status_test.go @@ -0,0 +1,17 @@ +package ecs + +import "testing" + +func TestSplitClusterTask(t *testing.T) { + taskArn := "arn:aws:ecs:us-west-2:123456789012:task/cluster-name/12345678123412341234123456789012" + expectedClusterName := "cluster-name" + + clusterName, taskID := SplitClusterTask(&taskArn) + + if clusterName != expectedClusterName { + t.Errorf("Expected cluster name %q, but got %q", expectedClusterName, clusterName) + } + if taskID != "12345678123412341234123456789012" { + t.Errorf("Expected task ID %q, but got %q", taskArn, taskID) + } +} diff --git a/src/pkg/clouds/aws/ecs/tail.go b/src/pkg/clouds/aws/ecs/tail.go index a8b908b77..1a3dd7c81 100644 --- a/src/pkg/clouds/aws/ecs/tail.go +++ b/src/pkg/clouds/aws/ecs/tail.go @@ -8,6 +8,7 @@ import ( "time" "github.com/DefangLabs/defang/src/pkg" + "github.com/DefangLabs/defang/src/pkg/clouds/aws/cw" "github.com/DefangLabs/defang/src/pkg/clouds/aws/region" "github.com/aws/aws-sdk-go-v2/service/cloudwatchlogs/types" ) @@ -33,7 +34,7 @@ func (a *AwsEcs) Tail(ctx context.Context, taskArn TaskArn) error { for { select { case e := <-es.Events(): // blocking - events, err := GetLogEvents(e) + events, err := cw.GetLogEvents(e) // Print before checking for errors, so we don't lose any logs in case of EOF for _, event := range events { fmt.Println(*event.Message) @@ -57,37 +58,23 @@ func (a *AwsEcs) GetTaskArn(taskID string) (TaskArn, error) { return &taskArn, nil } -func (a *AwsEcs) QueryTaskID(ctx context.Context, taskID string, start, end time.Time, limit int32) (EventStream[types.StartLiveTailResponseStream], error) { +func (a *AwsEcs) QueryTaskID(ctx context.Context, taskID string, start, end time.Time, limit int32) (cw.EventStream[types.StartLiveTailResponseStream], error) { if taskID == "" { return nil, errors.New("taskID is empty") } - ctx, cancel := context.WithCancel(ctx) - es := &eventStream{ - cancel: cancel, - ch: make(chan types.StartLiveTailResponseStream), - } - - lgi := LogGroupInput{LogGroupARN: a.LogGroupARN, LogStreamNames: []string{GetCDLogStreamForTaskID(taskID)}} - // Note: this function only returns once the query is complete, so returning an event stream is somewhat misleading - if err := QueryLogGroup(ctx, lgi, start, end, limit, func(events []LogEvent) error { - es.ch <- &types.StartLiveTailResponseStreamMemberSessionUpdate{ - Value: types.LiveTailSessionUpdate{SessionResults: events}, - } - return nil - }); err != nil { - es.err = err - } - return es, nil + lgi := cw.LogGroupInput{LogGroupARN: a.LogGroupARN, LogStreamNames: []string{GetCDLogStreamForTaskID(taskID)}} + return cw.QueryLogGroupStream(ctx, lgi, start, end, limit) } -func (a *AwsEcs) TailTaskID(ctx context.Context, taskID string) (LiveTailStream, error) { +func (a *AwsEcs) TailTaskID(ctx context.Context, taskID string) (cw.EventStream[types.StartLiveTailResponseStream], error) { if taskID == "" { return nil, errors.New("taskID is empty") } - lgi := LogGroupInput{LogGroupARN: a.LogGroupARN, LogStreamNames: []string{GetCDLogStreamForTaskID(taskID)}} + + lgi := cw.LogGroupInput{LogGroupARN: a.LogGroupARN, LogStreamNames: []string{GetCDLogStreamForTaskID(taskID)}} for { - stream, err := TailLogGroup(ctx, lgi) + stream, err := cw.TailLogGroup(ctx, lgi) if err != nil { var resourceNotFound *types.ResourceNotFoundException if !errors.As(err, &resourceNotFound) { diff --git a/src/pkg/github/version.go b/src/pkg/github/version.go new file mode 100644 index 000000000..45b93c633 --- /dev/null +++ b/src/pkg/github/version.go @@ -0,0 +1,54 @@ +package github + +import ( + "context" + "encoding/json" + "fmt" + "os" + + "github.com/DefangLabs/defang/src/pkg/http" + "github.com/DefangLabs/defang/src/pkg/term" +) + +const latestUrl = "https://api.github.com/repos/DefangLabs/defang/releases/latest" + +type githubError struct { + Message string + Status string + DocumentationUrl string +} + +func GetLatestReleaseTag(ctx context.Context) (string, error) { + // Anonymous API request to GitHub are rate limited to 60 requests per hour per IP. + // Check whether the user has set a GitHub token to increase the rate limit. (Copied from the install script.) + githubToken := os.Getenv("GITHUB_TOKEN") + if githubToken == "" { + githubToken = os.Getenv("GH_TOKEN") + } + header := http.Header{} + if githubToken != "" { + header.Set("Authorization", "Bearer "+githubToken) + } + resp, err := http.GetWithHeader(ctx, latestUrl, header) + if err != nil { + return "", err + } + defer resp.Body.Close() + if resp.StatusCode != 200 { + term.Debug(resp.Header) + // The primary rate limit for unauthenticated requests is 60 requests per hour, per IP. + // The API returns a 403 status code when the rate limit is exceeded. + githubError := githubError{Message: resp.Status} + if err := json.NewDecoder(resp.Body).Decode(&githubError); err != nil { + term.Debugf("Failed to decode GitHub response: %v", err) + } + return "", fmt.Errorf("error fetching release info from GitHub: %s", githubError.Message) + } + var release struct { + TagName string `json:"tag_name"` + } + if err = json.NewDecoder(resp.Body).Decode(&release); err != nil { + return "", err + } + return release.TagName, nil +} diff --git a/src/pkg/github/version_test.go b/src/pkg/github/version_test.go new file mode 100644 index 000000000..77a347c1e --- /dev/null +++ b/src/pkg/github/version_test.go @@ -0,0 +1,63 @@ +package github + +import ( + "fmt" + "net/http" + "net/http/httptest" + "testing" + + ourHttp "github.com/DefangLabs/defang/src/pkg/http" +) + +type mockRoundTripper struct { + method string + url string + resp *http.Response +} + +func (rt *mockRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { + if rt.method != "" && rt.method != req.Method { + return nil, fmt.Errorf("expected method %q; got %q", rt.method, req.Method) + } + if rt.url != "" && rt.url != req.URL.String() { + return nil, fmt.Errorf("expected URL %q; got %q", rt.url, req.URL.String()) + } + return rt.resp, nil +} + +func TestGetLatestVersion(t *testing.T) { + if testing.Short() { + t.Skip("skipping GitHub HTTP test in short mode to avoid rate limits.") + } + + ctx := t.Context() + + const version = "v1.2.3" + rec := httptest.NewRecorder() + rec.Header().Add("Content-Type", "application/json") + rec.WriteString(fmt.Sprintf(`{"tag_name":"%v"}`, version)) + response := rec.Result() + + client := ourHttp.DefaultClient + t.Cleanup(func() { + ourHttp.DefaultClient = client + response.Body.Close() + }) + + ourHttp.DefaultClient = &http.Client{Transport: &mockRoundTripper{ + method: http.MethodGet, + url: "https://api.github.com/repos/DefangLabs/defang/releases/latest", + resp: response, + }} + + v, err := GetLatestReleaseTag(ctx) + if err != nil { + t.Fatalf("GetLatestVersion() error = %v; want nil", err) + } + if v == "" { + t.Fatalf("GetLatestVersion() = %v; want non-empty", v) + } + if v != version { + t.Errorf("GetLatestVersion() = %v; want %v", v, version) + } +} diff --git a/src/pkg/term/input.go b/src/pkg/term/input.go index 2ebaeca8a..8c09437fa 100644 --- a/src/pkg/term/input.go +++ b/src/pkg/term/input.go @@ -4,6 +4,7 @@ import ( "errors" "io" "os" + "syscall" "github.com/ross96D/cancelreader" ) @@ -28,7 +29,7 @@ func (n *nonBlockingStdin) Close() error { func NewNonBlockingStdin() io.ReadCloser { cr, err := cancelreader.NewReader(os.Stdin) if err != nil { - return os.Stdin + return os.NewFile(uintptr(syscall.Stdin), "/dev/stdin") } return &nonBlockingStdin{cr} } diff --git a/src/pkg/types/driver.go b/src/pkg/types/driver.go index 9d658545b..3506520d0 100644 --- a/src/pkg/types/driver.go +++ b/src/pkg/types/driver.go @@ -12,10 +12,9 @@ type TaskID *string type ContainerCondition string const ( - ContainerStarted ContainerCondition = "START" - ContainerComplete ContainerCondition = "COMPLETE" - ContainerSuccess ContainerCondition = "SUCCESS" - ContainerHealthy ContainerCondition = "HEALTHY" + ContainerStarted ContainerCondition = "START" + ContainerSuccess ContainerCondition = "SUCCESS" + ContainerHealthy ContainerCondition = "HEALTHY" ) type Container struct { diff --git a/src/protos/io/defang/v1/fabric.pb.go b/src/protos/io/defang/v1/fabric.pb.go index c4b2aa250..3935f5f66 100644 --- a/src/protos/io/defang/v1/fabric.pb.go +++ b/src/protos/io/defang/v1/fabric.pb.go @@ -472,212 +472,6 @@ func (DeploymentAction) EnumDescriptor() ([]byte, []int) { return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{6} } -// Deprecated: Marked as deprecated in io/defang/v1/fabric.proto. -type Platform int32 - -const ( - Platform_LINUX_AMD64 Platform = 0 - Platform_LINUX_ARM64 Platform = 1 - Platform_LINUX_ANY Platform = 2 -) - -// Enum value maps for Platform. -var ( - Platform_name = map[int32]string{ - 0: "LINUX_AMD64", - 1: "LINUX_ARM64", - 2: "LINUX_ANY", - } - Platform_value = map[string]int32{ - "LINUX_AMD64": 0, - "LINUX_ARM64": 1, - "LINUX_ANY": 2, - } -) - -func (x Platform) Enum() *Platform { - p := new(Platform) - *p = x - return p -} - -func (x Platform) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (Platform) Descriptor() protoreflect.EnumDescriptor { - return file_io_defang_v1_fabric_proto_enumTypes[7].Descriptor() -} - -func (Platform) Type() protoreflect.EnumType { - return &file_io_defang_v1_fabric_proto_enumTypes[7] -} - -func (x Platform) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use Platform.Descriptor instead. -func (Platform) EnumDescriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{7} -} - -// Deprecated: Marked as deprecated in io/defang/v1/fabric.proto. -type Protocol int32 - -const ( - Protocol_ANY Protocol = 0 // unspecified means any protocol - Protocol_UDP Protocol = 1 - Protocol_TCP Protocol = 2 - Protocol_HTTP Protocol = 3 - Protocol_HTTP2 Protocol = 4 - Protocol_GRPC Protocol = 5 // HTTP/2 with gRPC health checks -) - -// Enum value maps for Protocol. -var ( - Protocol_name = map[int32]string{ - 0: "ANY", - 1: "UDP", - 2: "TCP", - 3: "HTTP", - 4: "HTTP2", - 5: "GRPC", - } - Protocol_value = map[string]int32{ - "ANY": 0, - "UDP": 1, - "TCP": 2, - "HTTP": 3, - "HTTP2": 4, - "GRPC": 5, - } -) - -func (x Protocol) Enum() *Protocol { - p := new(Protocol) - *p = x - return p -} - -func (x Protocol) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (Protocol) Descriptor() protoreflect.EnumDescriptor { - return file_io_defang_v1_fabric_proto_enumTypes[8].Descriptor() -} - -func (Protocol) Type() protoreflect.EnumType { - return &file_io_defang_v1_fabric_proto_enumTypes[8] -} - -func (x Protocol) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use Protocol.Descriptor instead. -func (Protocol) EnumDescriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{8} -} - -// Deprecated: Marked as deprecated in io/defang/v1/fabric.proto. -type Mode int32 - -const ( - Mode_HOST Mode = 0 // no load-balancer; suitable for internal services and functions - Mode_INGRESS Mode = 1 // with load-balancer; suitable for public services -) - -// Enum value maps for Mode. -var ( - Mode_name = map[int32]string{ - 0: "HOST", - 1: "INGRESS", - } - Mode_value = map[string]int32{ - "HOST": 0, - "INGRESS": 1, - } -) - -func (x Mode) Enum() *Mode { - p := new(Mode) - *p = x - return p -} - -func (x Mode) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (Mode) Descriptor() protoreflect.EnumDescriptor { - return file_io_defang_v1_fabric_proto_enumTypes[9].Descriptor() -} - -func (Mode) Type() protoreflect.EnumType { - return &file_io_defang_v1_fabric_proto_enumTypes[9] -} - -func (x Mode) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use Mode.Descriptor instead. -func (Mode) EnumDescriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{9} -} - -// Deprecated: Marked as deprecated in io/defang/v1/fabric.proto. -type Network int32 - -const ( - Network_UNSPECIFIED Network = 0 // was: internal=false - Network_PRIVATE Network = 1 // was: internal=true - Network_PUBLIC Network = 2 -) - -// Enum value maps for Network. -var ( - Network_name = map[int32]string{ - 0: "UNSPECIFIED", - 1: "PRIVATE", - 2: "PUBLIC", - } - Network_value = map[string]int32{ - "UNSPECIFIED": 0, - "PRIVATE": 1, - "PUBLIC": 2, - } -) - -func (x Network) Enum() *Network { - p := new(Network) - *p = x - return p -} - -func (x Network) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (Network) Descriptor() protoreflect.EnumDescriptor { - return file_io_defang_v1_fabric_proto_enumTypes[10].Descriptor() -} - -func (Network) Type() protoreflect.EnumType { - return &file_io_defang_v1_fabric_proto_enumTypes[10] -} - -func (x Network) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use Network.Descriptor instead. -func (Network) EnumDescriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{10} -} - type SubscriptionTier int32 const ( @@ -717,11 +511,11 @@ func (x SubscriptionTier) String() string { } func (SubscriptionTier) Descriptor() protoreflect.EnumDescriptor { - return file_io_defang_v1_fabric_proto_enumTypes[11].Descriptor() + return file_io_defang_v1_fabric_proto_enumTypes[7].Descriptor() } func (SubscriptionTier) Type() protoreflect.EnumType { - return &file_io_defang_v1_fabric_proto_enumTypes[11] + return &file_io_defang_v1_fabric_proto_enumTypes[7] } func (x SubscriptionTier) Number() protoreflect.EnumNumber { @@ -730,7 +524,7 @@ func (x SubscriptionTier) Number() protoreflect.EnumNumber { // Deprecated: Use SubscriptionTier.Descriptor instead. func (SubscriptionTier) EnumDescriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{11} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{7} } type SourcePlatform int32 @@ -763,11 +557,11 @@ func (x SourcePlatform) String() string { } func (SourcePlatform) Descriptor() protoreflect.EnumDescriptor { - return file_io_defang_v1_fabric_proto_enumTypes[12].Descriptor() + return file_io_defang_v1_fabric_proto_enumTypes[8].Descriptor() } func (SourcePlatform) Type() protoreflect.EnumType { - return &file_io_defang_v1_fabric_proto_enumTypes[12] + return &file_io_defang_v1_fabric_proto_enumTypes[8] } func (x SourcePlatform) Number() protoreflect.EnumNumber { @@ -776,7 +570,7 @@ func (x SourcePlatform) Number() protoreflect.EnumNumber { // Deprecated: Use SourcePlatform.Descriptor instead. func (SourcePlatform) EnumDescriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{12} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{8} } type TailRequest_LogType int32 @@ -815,11 +609,11 @@ func (x TailRequest_LogType) String() string { } func (TailRequest_LogType) Descriptor() protoreflect.EnumDescriptor { - return file_io_defang_v1_fabric_proto_enumTypes[13].Descriptor() + return file_io_defang_v1_fabric_proto_enumTypes[9].Descriptor() } func (TailRequest_LogType) Type() protoreflect.EnumType { - return &file_io_defang_v1_fabric_proto_enumTypes[13] + return &file_io_defang_v1_fabric_proto_enumTypes[9] } func (x TailRequest_LogType) Number() protoreflect.EnumNumber { @@ -1646,8 +1440,6 @@ func (x *CanIUseResponse) GetSignature() []byte { type DeployRequest struct { state protoimpl.MessageState `protogen:"open.v1"` // Deprecated: Marked as deprecated in io/defang/v1/fabric.proto. - Services []*Service `protobuf:"bytes,1,rep,name=services,proto3" json:"services,omitempty"` // deprecated; use compose - // Deprecated: Marked as deprecated in io/defang/v1/fabric.proto. Project string `protobuf:"bytes,2,opt,name=project,proto3" json:"project,omitempty"` // deprecated; use compose.name Mode DeploymentMode `protobuf:"varint,3,opt,name=mode,proto3,enum=io.defang.v1.DeploymentMode" json:"mode,omitempty"` Compose []byte `protobuf:"bytes,4,opt,name=compose,proto3" json:"compose,omitempty"` // yaml (or json) @@ -1690,14 +1482,6 @@ func (*DeployRequest) Descriptor() ([]byte, []int) { return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{13} } -// Deprecated: Marked as deprecated in io/defang/v1/fabric.proto. -func (x *DeployRequest) GetServices() []*Service { - if x != nil { - return x.Services - } - return nil -} - // Deprecated: Marked as deprecated in io/defang/v1/fabric.proto. func (x *DeployRequest) GetProject() string { if x != nil { @@ -2280,6 +2064,7 @@ type ServiceInfo struct { Domainname string `protobuf:"bytes,16,opt,name=domainname,proto3" json:"domainname,omitempty"` // domain name for the service LbDnsName string `protobuf:"bytes,17,opt,name=lb_dns_name,json=lbDnsName,proto3" json:"lb_dns_name,omitempty"` // fully qualified domain name for the load-balancer AllowScaling bool `protobuf:"varint,18,opt,name=allow_scaling,json=allowScaling,proto3" json:"allow_scaling,omitempty"` // true if service is allowed to autoscale + Healthcheck string `protobuf:"bytes,19,opt,name=healthcheck,proto3" json:"healthcheck,omitempty"` // healthcheck path Type ResourceType `protobuf:"varint,21,opt,name=type,proto3,enum=io.defang.v1.ResourceType" json:"type,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache @@ -2434,6 +2219,13 @@ func (x *ServiceInfo) GetAllowScaling() bool { return false } +func (x *ServiceInfo) GetHealthcheck() string { + if x != nil { + return x.Healthcheck + } + return "" +} + func (x *ServiceInfo) GetType() ResourceType { if x != nil { return x.Type @@ -3943,8 +3735,7 @@ func (x *ProjectUpdate) GetProjectOutputs() []byte { return nil } -// Deprecated: Marked as deprecated in io/defang/v1/fabric.proto. -type ServiceID struct { +type GetRequest struct { state protoimpl.MessageState `protogen:"open.v1"` Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` Project string `protobuf:"bytes,2,opt,name=project,proto3" json:"project,omitempty"` @@ -3952,20 +3743,20 @@ type ServiceID struct { sizeCache protoimpl.SizeCache } -func (x *ServiceID) Reset() { - *x = ServiceID{} +func (x *GetRequest) Reset() { + *x = GetRequest{} mi := &file_io_defang_v1_fabric_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *ServiceID) String() string { +func (x *GetRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ServiceID) ProtoMessage() {} +func (*GetRequest) ProtoMessage() {} -func (x *ServiceID) ProtoReflect() protoreflect.Message { +func (x *GetRequest) ProtoReflect() protoreflect.Message { mi := &file_io_defang_v1_fabric_proto_msgTypes[49] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -3977,47 +3768,47 @@ func (x *ServiceID) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ServiceID.ProtoReflect.Descriptor instead. -func (*ServiceID) Descriptor() ([]byte, []int) { +// Deprecated: Use GetRequest.ProtoReflect.Descriptor instead. +func (*GetRequest) Descriptor() ([]byte, []int) { return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{49} } -func (x *ServiceID) GetName() string { +func (x *GetRequest) GetName() string { if x != nil { return x.Name } return "" } -func (x *ServiceID) GetProject() string { +func (x *GetRequest) GetProject() string { if x != nil { return x.Project } return "" } -type GetRequest struct { +// Deprecated: Marked as deprecated in io/defang/v1/fabric.proto. +type Service struct { state protoimpl.MessageState `protogen:"open.v1"` Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Project string `protobuf:"bytes,2,opt,name=project,proto3" json:"project,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *GetRequest) Reset() { - *x = GetRequest{} +func (x *Service) Reset() { + *x = Service{} mi := &file_io_defang_v1_fabric_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *GetRequest) String() string { +func (x *Service) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetRequest) ProtoMessage() {} +func (*Service) ProtoMessage() {} -func (x *GetRequest) ProtoReflect() protoreflect.Message { +func (x *Service) ProtoReflect() protoreflect.Message { mi := &file_io_defang_v1_fabric_proto_msgTypes[50] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -4029,49 +3820,48 @@ func (x *GetRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetRequest.ProtoReflect.Descriptor instead. -func (*GetRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use Service.ProtoReflect.Descriptor instead. +func (*Service) Descriptor() ([]byte, []int) { return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{50} } -func (x *GetRequest) GetName() string { +func (x *Service) GetName() string { if x != nil { return x.Name } return "" } -func (x *GetRequest) GetProject() string { - if x != nil { - return x.Project - } - return "" -} - // Deprecated: Marked as deprecated in io/defang/v1/fabric.proto. -type Device struct { - state protoimpl.MessageState `protogen:"open.v1"` - Capabilities []string `protobuf:"bytes,1,rep,name=capabilities,proto3" json:"capabilities,omitempty"` // "gpu", "tpu", etc. - Driver string `protobuf:"bytes,2,opt,name=driver,proto3" json:"driver,omitempty"` // "nvidia", "amd", etc. - Count uint32 `protobuf:"varint,3,opt,name=count,proto3" json:"count,omitempty"` // number of devices to reserve - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache +type Event struct { + state protoimpl.MessageState `protogen:"open.v1"` + Specversion string `protobuf:"bytes,1,opt,name=specversion,proto3" json:"specversion,omitempty"` // required (but we don't care) + Type string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"` // required + Source string `protobuf:"bytes,3,opt,name=source,proto3" json:"source,omitempty"` // required + Id string `protobuf:"bytes,4,opt,name=id,proto3" json:"id,omitempty"` // required + Datacontenttype string `protobuf:"bytes,5,opt,name=datacontenttype,proto3" json:"datacontenttype,omitempty"` + Dataschema string `protobuf:"bytes,6,opt,name=dataschema,proto3" json:"dataschema,omitempty"` + Subject string `protobuf:"bytes,7,opt,name=subject,proto3" json:"subject,omitempty"` + Time *timestamppb.Timestamp `protobuf:"bytes,8,opt,name=time,proto3" json:"time,omitempty"` + Data []byte `protobuf:"bytes,9,opt,name=data,proto3" json:"data,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } -func (x *Device) Reset() { - *x = Device{} +func (x *Event) Reset() { + *x = Event{} mi := &file_io_defang_v1_fabric_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *Device) String() string { +func (x *Event) String() string { return protoimpl.X.MessageStringOf(x) } -func (*Device) ProtoMessage() {} +func (*Event) ProtoMessage() {} -func (x *Device) ProtoReflect() protoreflect.Message { +func (x *Event) ProtoReflect() protoreflect.Message { mi := &file_io_defang_v1_fabric_proto_msgTypes[51] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -4083,953 +3873,84 @@ func (x *Device) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use Device.ProtoReflect.Descriptor instead. -func (*Device) Descriptor() ([]byte, []int) { +// Deprecated: Use Event.ProtoReflect.Descriptor instead. +func (*Event) Descriptor() ([]byte, []int) { return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{51} } -func (x *Device) GetCapabilities() []string { +func (x *Event) GetSpecversion() string { if x != nil { - return x.Capabilities + return x.Specversion } - return nil + return "" } -func (x *Device) GetDriver() string { +func (x *Event) GetType() string { if x != nil { - return x.Driver + return x.Type } return "" } -func (x *Device) GetCount() uint32 { +func (x *Event) GetSource() string { if x != nil { - return x.Count + return x.Source } - return 0 -} - -// Deprecated: Marked as deprecated in io/defang/v1/fabric.proto. -type Resource struct { - state protoimpl.MessageState `protogen:"open.v1"` - Memory float32 `protobuf:"fixed32,1,opt,name=memory,proto3" json:"memory,omitempty"` // in MiB - Cpus float32 `protobuf:"fixed32,2,opt,name=cpus,proto3" json:"cpus,omitempty"` // fractional vCPUs - Devices []*Device `protobuf:"bytes,3,rep,name=devices,proto3" json:"devices,omitempty"` // devices & capabilities - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *Resource) Reset() { - *x = Resource{} - mi := &file_io_defang_v1_fabric_proto_msgTypes[52] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + return "" } -func (x *Resource) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *Event) GetId() string { + if x != nil { + return x.Id + } + return "" } -func (*Resource) ProtoMessage() {} - -func (x *Resource) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[52] +func (x *Event) GetDatacontenttype() string { if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms + return x.Datacontenttype } - return mi.MessageOf(x) + return "" } -// Deprecated: Use Resource.ProtoReflect.Descriptor instead. -func (*Resource) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{52} +func (x *Event) GetDataschema() string { + if x != nil { + return x.Dataschema + } + return "" } -func (x *Resource) GetMemory() float32 { +func (x *Event) GetSubject() string { if x != nil { - return x.Memory + return x.Subject } - return 0 + return "" } -func (x *Resource) GetCpus() float32 { +func (x *Event) GetTime() *timestamppb.Timestamp { if x != nil { - return x.Cpus + return x.Time } - return 0 + return nil } -func (x *Resource) GetDevices() []*Device { +func (x *Event) GetData() []byte { if x != nil { - return x.Devices + return x.Data } return nil } -// Deprecated: Marked as deprecated in io/defang/v1/fabric.proto. -type Resources struct { +type PublishRequest struct { state protoimpl.MessageState `protogen:"open.v1"` - Reservations *Resource `protobuf:"bytes,1,opt,name=reservations,proto3" json:"reservations,omitempty"` // requested resources - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *Resources) Reset() { - *x = Resources{} - mi := &file_io_defang_v1_fabric_proto_msgTypes[53] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *Resources) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Resources) ProtoMessage() {} - -func (x *Resources) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[53] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Resources.ProtoReflect.Descriptor instead. -func (*Resources) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{53} -} - -func (x *Resources) GetReservations() *Resource { - if x != nil { - return x.Reservations - } - return nil -} - -// Deprecated: Marked as deprecated in io/defang/v1/fabric.proto. -type Deploy struct { - state protoimpl.MessageState `protogen:"open.v1"` - Replicas uint32 `protobuf:"varint,1,opt,name=replicas,proto3" json:"replicas,omitempty"` // number of initial replicas - Resources *Resources `protobuf:"bytes,2,opt,name=resources,proto3" json:"resources,omitempty"` // reservations and limits - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *Deploy) Reset() { - *x = Deploy{} - mi := &file_io_defang_v1_fabric_proto_msgTypes[54] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *Deploy) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Deploy) ProtoMessage() {} - -func (x *Deploy) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[54] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Deploy.ProtoReflect.Descriptor instead. -func (*Deploy) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{54} -} - -func (x *Deploy) GetReplicas() uint32 { - if x != nil { - return x.Replicas - } - return 0 -} - -func (x *Deploy) GetResources() *Resources { - if x != nil { - return x.Resources - } - return nil -} - -// Deprecated: Marked as deprecated in io/defang/v1/fabric.proto. -type Port struct { - state protoimpl.MessageState `protogen:"open.v1"` - Target uint32 `protobuf:"varint,1,opt,name=target,proto3" json:"target,omitempty"` - Protocol Protocol `protobuf:"varint,2,opt,name=protocol,proto3,enum=io.defang.v1.Protocol" json:"protocol,omitempty"` - Mode Mode `protobuf:"varint,3,opt,name=mode,proto3,enum=io.defang.v1.Mode" json:"mode,omitempty"` // load-balanced (ingress) or not (host) - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *Port) Reset() { - *x = Port{} - mi := &file_io_defang_v1_fabric_proto_msgTypes[55] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *Port) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Port) ProtoMessage() {} - -func (x *Port) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[55] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Port.ProtoReflect.Descriptor instead. -func (*Port) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{55} -} - -func (x *Port) GetTarget() uint32 { - if x != nil { - return x.Target - } - return 0 -} - -func (x *Port) GetProtocol() Protocol { - if x != nil { - return x.Protocol - } - return Protocol_ANY -} - -func (x *Port) GetMode() Mode { - if x != nil { - return x.Mode - } - return Mode_HOST -} - -// Deprecated: Marked as deprecated in io/defang/v1/fabric.proto. -type Secret struct { - state protoimpl.MessageState `protogen:"open.v1"` - Source string `protobuf:"bytes,1,opt,name=source,proto3" json:"source,omitempty"` // name of the secret - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *Secret) Reset() { - *x = Secret{} - mi := &file_io_defang_v1_fabric_proto_msgTypes[56] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *Secret) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Secret) ProtoMessage() {} - -func (x *Secret) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[56] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Secret.ProtoReflect.Descriptor instead. -func (*Secret) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{56} -} - -func (x *Secret) GetSource() string { - if x != nil { - return x.Source - } - return "" -} - -// Deprecated: Marked as deprecated in io/defang/v1/fabric.proto. -type Build struct { - state protoimpl.MessageState `protogen:"open.v1"` - Context string `protobuf:"bytes,1,opt,name=context,proto3" json:"context,omitempty"` // path or URL to the build context - Dockerfile string `protobuf:"bytes,2,opt,name=dockerfile,proto3" json:"dockerfile,omitempty"` // path to the Dockerfile - Args map[string]string `protobuf:"bytes,3,rep,name=args,proto3" json:"args,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` // build-time variables - ShmSize float32 `protobuf:"fixed32,4,opt,name=shm_size,json=shmSize,proto3" json:"shm_size,omitempty"` // in MiB - Target string `protobuf:"bytes,5,opt,name=target,proto3" json:"target,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *Build) Reset() { - *x = Build{} - mi := &file_io_defang_v1_fabric_proto_msgTypes[57] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *Build) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Build) ProtoMessage() {} - -func (x *Build) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[57] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Build.ProtoReflect.Descriptor instead. -func (*Build) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{57} -} - -func (x *Build) GetContext() string { - if x != nil { - return x.Context - } - return "" -} - -func (x *Build) GetDockerfile() string { - if x != nil { - return x.Dockerfile - } - return "" -} - -func (x *Build) GetArgs() map[string]string { - if x != nil { - return x.Args - } - return nil -} - -func (x *Build) GetShmSize() float32 { - if x != nil { - return x.ShmSize - } - return 0 -} - -func (x *Build) GetTarget() string { - if x != nil { - return x.Target - } - return "" -} - -// Deprecated: Marked as deprecated in io/defang/v1/fabric.proto. -type HealthCheck struct { - state protoimpl.MessageState `protogen:"open.v1"` - Test []string `protobuf:"bytes,1,rep,name=test,proto3" json:"test,omitempty"` - Interval uint32 `protobuf:"varint,2,opt,name=interval,proto3" json:"interval,omitempty"` // in seconds - Timeout uint32 `protobuf:"varint,3,opt,name=timeout,proto3" json:"timeout,omitempty"` // in seconds; must be less than interval - Retries uint32 `protobuf:"varint,4,opt,name=retries,proto3" json:"retries,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *HealthCheck) Reset() { - *x = HealthCheck{} - mi := &file_io_defang_v1_fabric_proto_msgTypes[58] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *HealthCheck) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*HealthCheck) ProtoMessage() {} - -func (x *HealthCheck) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[58] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use HealthCheck.ProtoReflect.Descriptor instead. -func (*HealthCheck) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{58} -} - -func (x *HealthCheck) GetTest() []string { - if x != nil { - return x.Test - } - return nil -} - -func (x *HealthCheck) GetInterval() uint32 { - if x != nil { - return x.Interval - } - return 0 -} - -func (x *HealthCheck) GetTimeout() uint32 { - if x != nil { - return x.Timeout - } - return 0 -} - -func (x *HealthCheck) GetRetries() uint32 { - if x != nil { - return x.Retries - } - return 0 -} - -// Deprecated: Marked as deprecated in io/defang/v1/fabric.proto. -type Service struct { - state protoimpl.MessageState `protogen:"open.v1"` - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Image string `protobuf:"bytes,2,opt,name=image,proto3" json:"image,omitempty"` - Platform Platform `protobuf:"varint,3,opt,name=platform,proto3,enum=io.defang.v1.Platform" json:"platform,omitempty"` - // Deprecated: Marked as deprecated in io/defang/v1/fabric.proto. - Internal bool `protobuf:"varint,4,opt,name=internal,proto3" json:"internal,omitempty"` // deprecated: use networks - Deploy *Deploy `protobuf:"bytes,5,opt,name=deploy,proto3" json:"deploy,omitempty"` - Ports []*Port `protobuf:"bytes,6,rep,name=ports,proto3" json:"ports,omitempty"` - Environment map[string]string `protobuf:"bytes,7,rep,name=environment,proto3" json:"environment,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` - Build *Build `protobuf:"bytes,8,opt,name=build,proto3" json:"build,omitempty"` - Secrets []*Secret `protobuf:"bytes,9,rep,name=secrets,proto3" json:"secrets,omitempty"` // FIXME: these are actually env vars - Healthcheck *HealthCheck `protobuf:"bytes,10,opt,name=healthcheck,proto3" json:"healthcheck,omitempty"` - Command []string `protobuf:"bytes,11,rep,name=command,proto3" json:"command,omitempty"` - Domainname string `protobuf:"bytes,12,opt,name=domainname,proto3" json:"domainname,omitempty"` - Init bool `protobuf:"varint,13,opt,name=init,proto3" json:"init,omitempty"` - DnsRole string `protobuf:"bytes,14,opt,name=dns_role,json=dnsRole,proto3" json:"dns_role,omitempty"` // x-defang-dns-role: role arn used to access route53 to - // create dns records - StaticFiles *StaticFiles `protobuf:"bytes,15,opt,name=static_files,json=staticFiles,proto3" json:"static_files,omitempty"` // x-defang-static-files: use a managed CDN - Networks Network `protobuf:"varint,16,opt,name=networks,proto3,enum=io.defang.v1.Network" json:"networks,omitempty"` // currently only 1 network is supported - Aliases []string `protobuf:"bytes,17,rep,name=aliases,proto3" json:"aliases,omitempty"` - Redis *Redis `protobuf:"bytes,18,opt,name=redis,proto3" json:"redis,omitempty"` // x-defang-redis: use a managed redis - Project string `protobuf:"bytes,20,opt,name=project,proto3" json:"project,omitempty"` // defaults to tenant ID - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *Service) Reset() { - *x = Service{} - mi := &file_io_defang_v1_fabric_proto_msgTypes[59] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *Service) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Service) ProtoMessage() {} - -func (x *Service) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[59] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Service.ProtoReflect.Descriptor instead. -func (*Service) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{59} -} - -func (x *Service) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *Service) GetImage() string { - if x != nil { - return x.Image - } - return "" -} - -func (x *Service) GetPlatform() Platform { - if x != nil { - return x.Platform - } - return Platform_LINUX_AMD64 -} - -// Deprecated: Marked as deprecated in io/defang/v1/fabric.proto. -func (x *Service) GetInternal() bool { - if x != nil { - return x.Internal - } - return false -} - -func (x *Service) GetDeploy() *Deploy { - if x != nil { - return x.Deploy - } - return nil -} - -func (x *Service) GetPorts() []*Port { - if x != nil { - return x.Ports - } - return nil -} - -func (x *Service) GetEnvironment() map[string]string { - if x != nil { - return x.Environment - } - return nil -} - -func (x *Service) GetBuild() *Build { - if x != nil { - return x.Build - } - return nil -} - -func (x *Service) GetSecrets() []*Secret { - if x != nil { - return x.Secrets - } - return nil -} - -func (x *Service) GetHealthcheck() *HealthCheck { - if x != nil { - return x.Healthcheck - } - return nil -} - -func (x *Service) GetCommand() []string { - if x != nil { - return x.Command - } - return nil -} - -func (x *Service) GetDomainname() string { - if x != nil { - return x.Domainname - } - return "" -} - -func (x *Service) GetInit() bool { - if x != nil { - return x.Init - } - return false -} - -func (x *Service) GetDnsRole() string { - if x != nil { - return x.DnsRole - } - return "" -} - -func (x *Service) GetStaticFiles() *StaticFiles { - if x != nil { - return x.StaticFiles - } - return nil -} - -func (x *Service) GetNetworks() Network { - if x != nil { - return x.Networks - } - return Network_UNSPECIFIED -} - -func (x *Service) GetAliases() []string { - if x != nil { - return x.Aliases - } - return nil -} - -func (x *Service) GetRedis() *Redis { - if x != nil { - return x.Redis - } - return nil -} - -func (x *Service) GetProject() string { - if x != nil { - return x.Project - } - return "" -} - -// Deprecated: Marked as deprecated in io/defang/v1/fabric.proto. -type StaticFiles struct { - state protoimpl.MessageState `protogen:"open.v1"` - Folder string `protobuf:"bytes,1,opt,name=folder,proto3" json:"folder,omitempty"` - Redirects []string `protobuf:"bytes,2,rep,name=redirects,proto3" json:"redirects,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *StaticFiles) Reset() { - *x = StaticFiles{} - mi := &file_io_defang_v1_fabric_proto_msgTypes[60] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *StaticFiles) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*StaticFiles) ProtoMessage() {} - -func (x *StaticFiles) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[60] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use StaticFiles.ProtoReflect.Descriptor instead. -func (*StaticFiles) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{60} -} - -func (x *StaticFiles) GetFolder() string { - if x != nil { - return x.Folder - } - return "" -} - -func (x *StaticFiles) GetRedirects() []string { - if x != nil { - return x.Redirects - } - return nil -} - -// Deprecated: Marked as deprecated in io/defang/v1/fabric.proto. -type Redis struct { - state protoimpl.MessageState `protogen:"open.v1"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *Redis) Reset() { - *x = Redis{} - mi := &file_io_defang_v1_fabric_proto_msgTypes[61] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *Redis) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Redis) ProtoMessage() {} - -func (x *Redis) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[61] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Redis.ProtoReflect.Descriptor instead. -func (*Redis) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{61} -} - -// TODO: internal message; move to a separate proto file; was Event -type DeployEvent struct { - state protoimpl.MessageState `protogen:"open.v1"` - Mode DeploymentMode `protobuf:"varint,1,opt,name=mode,proto3,enum=io.defang.v1.DeploymentMode" json:"mode,omitempty"` - Type string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"` // required - Source string `protobuf:"bytes,3,opt,name=source,proto3" json:"source,omitempty"` - Id string `protobuf:"bytes,4,opt,name=id,proto3" json:"id,omitempty"` // etag - Datacontenttype string `protobuf:"bytes,5,opt,name=datacontenttype,proto3" json:"datacontenttype,omitempty"` - Dataschema string `protobuf:"bytes,6,opt,name=dataschema,proto3" json:"dataschema,omitempty"` - Subject string `protobuf:"bytes,7,opt,name=subject,proto3" json:"subject,omitempty"` // tenant|stack; also used as SQS group ID - Time *timestamppb.Timestamp `protobuf:"bytes,8,opt,name=time,proto3" json:"time,omitempty"` - Data []byte `protobuf:"bytes,9,opt,name=data,proto3" json:"data,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *DeployEvent) Reset() { - *x = DeployEvent{} - mi := &file_io_defang_v1_fabric_proto_msgTypes[62] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *DeployEvent) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DeployEvent) ProtoMessage() {} - -func (x *DeployEvent) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[62] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use DeployEvent.ProtoReflect.Descriptor instead. -func (*DeployEvent) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{62} -} - -func (x *DeployEvent) GetMode() DeploymentMode { - if x != nil { - return x.Mode - } - return DeploymentMode_MODE_UNSPECIFIED -} - -func (x *DeployEvent) GetType() string { - if x != nil { - return x.Type - } - return "" -} - -func (x *DeployEvent) GetSource() string { - if x != nil { - return x.Source - } - return "" -} - -func (x *DeployEvent) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *DeployEvent) GetDatacontenttype() string { - if x != nil { - return x.Datacontenttype - } - return "" -} - -func (x *DeployEvent) GetDataschema() string { - if x != nil { - return x.Dataschema - } - return "" -} - -func (x *DeployEvent) GetSubject() string { - if x != nil { - return x.Subject - } - return "" -} - -func (x *DeployEvent) GetTime() *timestamppb.Timestamp { - if x != nil { - return x.Time - } - return nil -} - -func (x *DeployEvent) GetData() []byte { - if x != nil { - return x.Data - } - return nil -} - -// Deprecated: Marked as deprecated in io/defang/v1/fabric.proto. -type Event struct { - state protoimpl.MessageState `protogen:"open.v1"` - Specversion string `protobuf:"bytes,1,opt,name=specversion,proto3" json:"specversion,omitempty"` // required (but we don't care) - Type string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"` // required - Source string `protobuf:"bytes,3,opt,name=source,proto3" json:"source,omitempty"` // required - Id string `protobuf:"bytes,4,opt,name=id,proto3" json:"id,omitempty"` // required - Datacontenttype string `protobuf:"bytes,5,opt,name=datacontenttype,proto3" json:"datacontenttype,omitempty"` - Dataschema string `protobuf:"bytes,6,opt,name=dataschema,proto3" json:"dataschema,omitempty"` - Subject string `protobuf:"bytes,7,opt,name=subject,proto3" json:"subject,omitempty"` - Time *timestamppb.Timestamp `protobuf:"bytes,8,opt,name=time,proto3" json:"time,omitempty"` - Data []byte `protobuf:"bytes,9,opt,name=data,proto3" json:"data,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache -} - -func (x *Event) Reset() { - *x = Event{} - mi := &file_io_defang_v1_fabric_proto_msgTypes[63] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) -} - -func (x *Event) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Event) ProtoMessage() {} - -func (x *Event) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[63] - if x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Event.ProtoReflect.Descriptor instead. -func (*Event) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{63} -} - -func (x *Event) GetSpecversion() string { - if x != nil { - return x.Specversion - } - return "" -} - -func (x *Event) GetType() string { - if x != nil { - return x.Type - } - return "" -} - -func (x *Event) GetSource() string { - if x != nil { - return x.Source - } - return "" -} - -func (x *Event) GetId() string { - if x != nil { - return x.Id - } - return "" -} - -func (x *Event) GetDatacontenttype() string { - if x != nil { - return x.Datacontenttype - } - return "" -} - -func (x *Event) GetDataschema() string { - if x != nil { - return x.Dataschema - } - return "" -} - -func (x *Event) GetSubject() string { - if x != nil { - return x.Subject - } - return "" -} - -func (x *Event) GetTime() *timestamppb.Timestamp { - if x != nil { - return x.Time - } - return nil -} - -func (x *Event) GetData() []byte { - if x != nil { - return x.Data - } - return nil -} - -type PublishRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - Event *Event `protobuf:"bytes,1,opt,name=event,proto3" json:"event,omitempty"` + Event *Event `protobuf:"bytes,1,opt,name=event,proto3" json:"event,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } func (x *PublishRequest) Reset() { *x = PublishRequest{} - mi := &file_io_defang_v1_fabric_proto_msgTypes[64] + mi := &file_io_defang_v1_fabric_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5041,7 +3962,7 @@ func (x *PublishRequest) String() string { func (*PublishRequest) ProtoMessage() {} func (x *PublishRequest) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[64] + mi := &file_io_defang_v1_fabric_proto_msgTypes[52] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5054,7 +3975,7 @@ func (x *PublishRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PublishRequest.ProtoReflect.Descriptor instead. func (*PublishRequest) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{64} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{52} } func (x *PublishRequest) GetEvent() *Event { @@ -5075,7 +3996,7 @@ type SubscribeRequest struct { func (x *SubscribeRequest) Reset() { *x = SubscribeRequest{} - mi := &file_io_defang_v1_fabric_proto_msgTypes[65] + mi := &file_io_defang_v1_fabric_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5087,7 +4008,7 @@ func (x *SubscribeRequest) String() string { func (*SubscribeRequest) ProtoMessage() {} func (x *SubscribeRequest) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[65] + mi := &file_io_defang_v1_fabric_proto_msgTypes[53] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5100,7 +4021,7 @@ func (x *SubscribeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SubscribeRequest.ProtoReflect.Descriptor instead. func (*SubscribeRequest) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{65} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{53} } func (x *SubscribeRequest) GetServices() []string { @@ -5137,7 +4058,7 @@ type SubscribeResponse struct { func (x *SubscribeResponse) Reset() { *x = SubscribeResponse{} - mi := &file_io_defang_v1_fabric_proto_msgTypes[66] + mi := &file_io_defang_v1_fabric_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5149,7 +4070,7 @@ func (x *SubscribeResponse) String() string { func (*SubscribeResponse) ProtoMessage() {} func (x *SubscribeResponse) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[66] + mi := &file_io_defang_v1_fabric_proto_msgTypes[54] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5162,7 +4083,7 @@ func (x *SubscribeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SubscribeResponse.ProtoReflect.Descriptor instead. func (*SubscribeResponse) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{66} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{54} } // Deprecated: Marked as deprecated in io/defang/v1/fabric.proto. @@ -5203,7 +4124,7 @@ type GetServicesRequest struct { func (x *GetServicesRequest) Reset() { *x = GetServicesRequest{} - mi := &file_io_defang_v1_fabric_proto_msgTypes[67] + mi := &file_io_defang_v1_fabric_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5215,7 +4136,7 @@ func (x *GetServicesRequest) String() string { func (*GetServicesRequest) ProtoMessage() {} func (x *GetServicesRequest) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[67] + mi := &file_io_defang_v1_fabric_proto_msgTypes[55] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5228,7 +4149,7 @@ func (x *GetServicesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetServicesRequest.ProtoReflect.Descriptor instead. func (*GetServicesRequest) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{67} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{55} } func (x *GetServicesRequest) GetProject() string { @@ -5248,7 +4169,7 @@ type DelegateSubdomainZoneRequest struct { func (x *DelegateSubdomainZoneRequest) Reset() { *x = DelegateSubdomainZoneRequest{} - mi := &file_io_defang_v1_fabric_proto_msgTypes[68] + mi := &file_io_defang_v1_fabric_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5260,7 +4181,7 @@ func (x *DelegateSubdomainZoneRequest) String() string { func (*DelegateSubdomainZoneRequest) ProtoMessage() {} func (x *DelegateSubdomainZoneRequest) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[68] + mi := &file_io_defang_v1_fabric_proto_msgTypes[56] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5273,7 +4194,7 @@ func (x *DelegateSubdomainZoneRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DelegateSubdomainZoneRequest.ProtoReflect.Descriptor instead. func (*DelegateSubdomainZoneRequest) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{68} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{56} } func (x *DelegateSubdomainZoneRequest) GetNameServerRecords() []string { @@ -5299,7 +4220,7 @@ type DelegateSubdomainZoneResponse struct { func (x *DelegateSubdomainZoneResponse) Reset() { *x = DelegateSubdomainZoneResponse{} - mi := &file_io_defang_v1_fabric_proto_msgTypes[69] + mi := &file_io_defang_v1_fabric_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5311,7 +4232,7 @@ func (x *DelegateSubdomainZoneResponse) String() string { func (*DelegateSubdomainZoneResponse) ProtoMessage() {} func (x *DelegateSubdomainZoneResponse) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[69] + mi := &file_io_defang_v1_fabric_proto_msgTypes[57] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5324,7 +4245,7 @@ func (x *DelegateSubdomainZoneResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DelegateSubdomainZoneResponse.ProtoReflect.Descriptor instead. func (*DelegateSubdomainZoneResponse) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{69} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{57} } func (x *DelegateSubdomainZoneResponse) GetZone() string { @@ -5343,7 +4264,7 @@ type DeleteSubdomainZoneRequest struct { func (x *DeleteSubdomainZoneRequest) Reset() { *x = DeleteSubdomainZoneRequest{} - mi := &file_io_defang_v1_fabric_proto_msgTypes[70] + mi := &file_io_defang_v1_fabric_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5355,7 +4276,7 @@ func (x *DeleteSubdomainZoneRequest) String() string { func (*DeleteSubdomainZoneRequest) ProtoMessage() {} func (x *DeleteSubdomainZoneRequest) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[70] + mi := &file_io_defang_v1_fabric_proto_msgTypes[58] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5368,7 +4289,7 @@ func (x *DeleteSubdomainZoneRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteSubdomainZoneRequest.ProtoReflect.Descriptor instead. func (*DeleteSubdomainZoneRequest) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{70} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{58} } func (x *DeleteSubdomainZoneRequest) GetProject() string { @@ -5387,7 +4308,7 @@ type GetDelegateSubdomainZoneRequest struct { func (x *GetDelegateSubdomainZoneRequest) Reset() { *x = GetDelegateSubdomainZoneRequest{} - mi := &file_io_defang_v1_fabric_proto_msgTypes[71] + mi := &file_io_defang_v1_fabric_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5399,7 +4320,7 @@ func (x *GetDelegateSubdomainZoneRequest) String() string { func (*GetDelegateSubdomainZoneRequest) ProtoMessage() {} func (x *GetDelegateSubdomainZoneRequest) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[71] + mi := &file_io_defang_v1_fabric_proto_msgTypes[59] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5412,7 +4333,7 @@ func (x *GetDelegateSubdomainZoneRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetDelegateSubdomainZoneRequest.ProtoReflect.Descriptor instead. func (*GetDelegateSubdomainZoneRequest) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{71} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{59} } func (x *GetDelegateSubdomainZoneRequest) GetProject() string { @@ -5432,7 +4353,7 @@ type SetOptionsRequest struct { func (x *SetOptionsRequest) Reset() { *x = SetOptionsRequest{} - mi := &file_io_defang_v1_fabric_proto_msgTypes[72] + mi := &file_io_defang_v1_fabric_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5444,7 +4365,7 @@ func (x *SetOptionsRequest) String() string { func (*SetOptionsRequest) ProtoMessage() {} func (x *SetOptionsRequest) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[72] + mi := &file_io_defang_v1_fabric_proto_msgTypes[60] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5457,7 +4378,7 @@ func (x *SetOptionsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetOptionsRequest.ProtoReflect.Descriptor instead. func (*SetOptionsRequest) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{72} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{60} } func (x *SetOptionsRequest) GetTrainingOptOut() bool { @@ -5489,7 +4410,7 @@ type WhoAmIResponse struct { func (x *WhoAmIResponse) Reset() { *x = WhoAmIResponse{} - mi := &file_io_defang_v1_fabric_proto_msgTypes[73] + mi := &file_io_defang_v1_fabric_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5501,7 +4422,7 @@ func (x *WhoAmIResponse) String() string { func (*WhoAmIResponse) ProtoMessage() {} func (x *WhoAmIResponse) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[73] + mi := &file_io_defang_v1_fabric_proto_msgTypes[61] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5514,7 +4435,7 @@ func (x *WhoAmIResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use WhoAmIResponse.ProtoReflect.Descriptor instead. func (*WhoAmIResponse) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{73} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{61} } func (x *WhoAmIResponse) GetTenant() string { @@ -5577,7 +4498,7 @@ type EstimateRequest struct { func (x *EstimateRequest) Reset() { *x = EstimateRequest{} - mi := &file_io_defang_v1_fabric_proto_msgTypes[74] + mi := &file_io_defang_v1_fabric_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5589,7 +4510,7 @@ func (x *EstimateRequest) String() string { func (*EstimateRequest) ProtoMessage() {} func (x *EstimateRequest) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[74] + mi := &file_io_defang_v1_fabric_proto_msgTypes[62] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5602,7 +4523,7 @@ func (x *EstimateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use EstimateRequest.ProtoReflect.Descriptor instead. func (*EstimateRequest) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{74} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{62} } func (x *EstimateRequest) GetProvider() Provider { @@ -5639,7 +4560,7 @@ type EstimateLineItem struct { func (x *EstimateLineItem) Reset() { *x = EstimateLineItem{} - mi := &file_io_defang_v1_fabric_proto_msgTypes[75] + mi := &file_io_defang_v1_fabric_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5651,7 +4572,7 @@ func (x *EstimateLineItem) String() string { func (*EstimateLineItem) ProtoMessage() {} func (x *EstimateLineItem) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[75] + mi := &file_io_defang_v1_fabric_proto_msgTypes[63] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5664,7 +4585,7 @@ func (x *EstimateLineItem) ProtoReflect() protoreflect.Message { // Deprecated: Use EstimateLineItem.ProtoReflect.Descriptor instead. func (*EstimateLineItem) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{75} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{63} } func (x *EstimateLineItem) GetDescription() string { @@ -5714,7 +4635,7 @@ type EstimateResponse struct { func (x *EstimateResponse) Reset() { *x = EstimateResponse{} - mi := &file_io_defang_v1_fabric_proto_msgTypes[76] + mi := &file_io_defang_v1_fabric_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5726,7 +4647,7 @@ func (x *EstimateResponse) String() string { func (*EstimateResponse) ProtoMessage() {} func (x *EstimateResponse) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[76] + mi := &file_io_defang_v1_fabric_proto_msgTypes[64] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5739,7 +4660,7 @@ func (x *EstimateResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use EstimateResponse.ProtoReflect.Descriptor instead. func (*EstimateResponse) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{76} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{64} } func (x *EstimateResponse) GetProvider() Provider { @@ -5784,7 +4705,7 @@ type PreviewRequest struct { func (x *PreviewRequest) Reset() { *x = PreviewRequest{} - mi := &file_io_defang_v1_fabric_proto_msgTypes[77] + mi := &file_io_defang_v1_fabric_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5796,7 +4717,7 @@ func (x *PreviewRequest) String() string { func (*PreviewRequest) ProtoMessage() {} func (x *PreviewRequest) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[77] + mi := &file_io_defang_v1_fabric_proto_msgTypes[65] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5809,7 +4730,7 @@ func (x *PreviewRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use PreviewRequest.ProtoReflect.Descriptor instead. func (*PreviewRequest) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{77} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{65} } func (x *PreviewRequest) GetProvider() Provider { @@ -5863,7 +4784,7 @@ type PreviewResponse struct { func (x *PreviewResponse) Reset() { *x = PreviewResponse{} - mi := &file_io_defang_v1_fabric_proto_msgTypes[78] + mi := &file_io_defang_v1_fabric_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5875,7 +4796,7 @@ func (x *PreviewResponse) String() string { func (*PreviewResponse) ProtoMessage() {} func (x *PreviewResponse) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[78] + mi := &file_io_defang_v1_fabric_proto_msgTypes[66] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5888,7 +4809,7 @@ func (x *PreviewResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use PreviewResponse.ProtoReflect.Descriptor instead. func (*PreviewResponse) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{78} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{66} } func (x *PreviewResponse) GetEtag() string { @@ -5909,7 +4830,7 @@ type GenerateComposeRequest struct { func (x *GenerateComposeRequest) Reset() { *x = GenerateComposeRequest{} - mi := &file_io_defang_v1_fabric_proto_msgTypes[79] + mi := &file_io_defang_v1_fabric_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5921,7 +4842,7 @@ func (x *GenerateComposeRequest) String() string { func (*GenerateComposeRequest) ProtoMessage() {} func (x *GenerateComposeRequest) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[79] + mi := &file_io_defang_v1_fabric_proto_msgTypes[67] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5934,7 +4855,7 @@ func (x *GenerateComposeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GenerateComposeRequest.ProtoReflect.Descriptor instead. func (*GenerateComposeRequest) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{79} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{67} } func (x *GenerateComposeRequest) GetPlatform() SourcePlatform { @@ -5967,7 +4888,7 @@ type GenerateComposeResponse struct { func (x *GenerateComposeResponse) Reset() { *x = GenerateComposeResponse{} - mi := &file_io_defang_v1_fabric_proto_msgTypes[80] + mi := &file_io_defang_v1_fabric_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5979,7 +4900,7 @@ func (x *GenerateComposeResponse) String() string { func (*GenerateComposeResponse) ProtoMessage() {} func (x *GenerateComposeResponse) ProtoReflect() protoreflect.Message { - mi := &file_io_defang_v1_fabric_proto_msgTypes[80] + mi := &file_io_defang_v1_fabric_proto_msgTypes[68] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5992,7 +4913,7 @@ func (x *GenerateComposeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GenerateComposeResponse.ProtoReflect.Descriptor instead. func (*GenerateComposeResponse) Descriptor() ([]byte, []int) { - return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{80} + return file_io_defang_v1_fabric_proto_rawDescGZIP(), []int{68} } func (x *GenerateComposeResponse) GetCompose() []byte { @@ -6120,717 +5041,575 @@ var file_io_defang_v1_fabric_proto_rawDesc = []byte{ 0x6c, 0x75, 0x6d, 0x69, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x22, - 0xd7, 0x02, 0x0a, 0x0d, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x35, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, - 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x42, 0x02, 0x18, 0x01, 0x52, 0x08, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x07, 0x70, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x30, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, - 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x6f, - 0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x70, - 0x6f, 0x73, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x70, 0x6f, - 0x73, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x5f, 0x64, - 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x64, 0x65, 0x6c, - 0x65, 0x67, 0x61, 0x74, 0x65, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x2a, 0x0a, 0x11, 0x64, - 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x07, 0x70, 0x72, 0x65, 0x76, 0x69, - 0x65, 0x77, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x42, 0x02, 0x18, 0x01, 0x52, 0x07, 0x70, 0x72, - 0x65, 0x76, 0x69, 0x65, 0x77, 0x12, 0x32, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, - 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, - 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x22, 0x5b, 0x0a, 0x0e, 0x44, 0x65, 0x70, - 0x6c, 0x6f, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, - 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, 0x22, 0x68, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x18, 0x0a, - 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x65, 0x6c, 0x65, 0x67, - 0x61, 0x74, 0x65, 0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0e, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, - 0x22, 0x24, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, 0x22, 0xac, 0x01, 0x0a, 0x14, 0x47, 0x65, 0x6e, 0x65, 0x72, - 0x61, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x16, 0x0a, 0x06, 0x70, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x70, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, - 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, - 0x61, 0x67, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x61, 0x67, 0x72, 0x65, 0x65, 0x5f, 0x74, 0x6f, 0x73, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x61, 0x67, 0x72, 0x65, 0x65, 0x54, 0x6f, 0x73, - 0x12, 0x28, 0x0a, 0x10, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x6f, 0x70, 0x74, - 0x5f, 0x6f, 0x75, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x74, 0x72, 0x61, 0x69, - 0x6e, 0x69, 0x6e, 0x67, 0x4f, 0x70, 0x74, 0x4f, 0x75, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x6f, - 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x6f, - 0x64, 0x65, 0x6c, 0x49, 0x64, 0x22, 0x34, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x41, 0x0a, 0x15, 0x47, - 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x05, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, - 0x76, 0x31, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x05, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x22, 0x2b, - 0x0a, 0x15, 0x53, 0x74, 0x61, 0x72, 0x74, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x22, 0x2b, 0x0a, 0x15, 0x47, - 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x22, 0x44, 0x0a, 0x10, 0x55, 0x70, 0x6c, 0x6f, - 0x61, 0x64, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, - 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x69, - 0x67, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x25, - 0x0a, 0x11, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x75, 0x72, 0x6c, 0x22, 0x96, 0x05, 0x0a, 0x0b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2f, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, - 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x07, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, - 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x64, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x12, - 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x74, - 0x61, 0x67, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x61, - 0x74, 0x5f, 0x69, 0x70, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x61, 0x74, - 0x49, 0x70, 0x73, 0x12, 0x15, 0x0a, 0x06, 0x6c, 0x62, 0x5f, 0x69, 0x70, 0x73, 0x18, 0x07, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x62, 0x49, 0x70, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x72, - 0x69, 0x76, 0x61, 0x74, 0x65, 0x5f, 0x66, 0x71, 0x64, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x46, 0x71, 0x64, 0x6e, 0x12, 0x1f, 0x0a, - 0x0b, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x66, 0x71, 0x64, 0x6e, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x46, 0x71, 0x64, 0x6e, 0x12, 0x39, - 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0a, 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, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0b, 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, 0x75, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x64, 0x41, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x7a, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, - 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x7a, 0x6f, 0x6e, 0x65, 0x49, 0x64, 0x12, 0x22, 0x0a, - 0x0d, 0x75, 0x73, 0x65, 0x5f, 0x61, 0x63, 0x6d, 0x65, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x18, 0x0d, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x75, 0x73, 0x65, 0x41, 0x63, 0x6d, 0x65, 0x43, 0x65, 0x72, - 0x74, 0x12, 0x30, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x1a, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, - 0x61, 0x74, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0b, 0x6c, 0x62, 0x5f, 0x64, 0x6e, 0x73, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x62, 0x44, 0x6e, 0x73, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x73, 0x63, 0x61, - 0x6c, 0x69, 0x6e, 0x67, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x6f, - 0x77, 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x2e, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x15, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, - 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, - 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x4a, 0x04, 0x08, 0x0e, 0x10, 0x0f, 0x22, 0x3d, - 0x0a, 0x07, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x61, 0x6d, - 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x12, - 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x3a, 0x02, 0x18, 0x01, 0x22, 0x55, 0x0a, - 0x0b, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x12, 0x0a, 0x04, + 0xa6, 0x02, 0x0a, 0x0d, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1c, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, + 0x30, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, + 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, + 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x64, + 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x44, 0x6f, + 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x2a, 0x0a, 0x11, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0f, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x49, 0x64, + 0x12, 0x1c, 0x0a, 0x07, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x08, 0x42, 0x02, 0x18, 0x01, 0x52, 0x07, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x12, 0x32, + 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x16, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, + 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x22, 0x5b, 0x0a, 0x0e, 0x44, 0x65, 0x70, 0x6c, + 0x6f, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, + 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x65, 0x74, 0x61, 0x67, 0x22, 0x68, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, + 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, + 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, + 0x74, 0x65, 0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0e, 0x64, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x22, + 0x24, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x65, 0x74, 0x61, 0x67, 0x22, 0xac, 0x01, 0x0a, 0x14, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, + 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, + 0x0a, 0x06, 0x70, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x70, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, + 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, + 0x67, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x61, 0x67, 0x72, 0x65, 0x65, 0x5f, 0x74, 0x6f, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x61, 0x67, 0x72, 0x65, 0x65, 0x54, 0x6f, 0x73, 0x12, + 0x28, 0x0a, 0x10, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x6f, 0x70, 0x74, 0x5f, + 0x6f, 0x75, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x74, 0x72, 0x61, 0x69, 0x6e, + 0x69, 0x6e, 0x67, 0x4f, 0x70, 0x74, 0x4f, 0x75, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x6f, 0x64, + 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x6f, 0x64, + 0x65, 0x6c, 0x49, 0x64, 0x22, 0x34, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, - 0x3a, 0x02, 0x18, 0x01, 0x22, 0x7a, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x12, 0x2c, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x18, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x22, 0x39, 0x0a, 0x09, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4b, 0x65, 0x79, 0x12, 0x12, 0x0a, + 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x41, 0x0a, 0x15, 0x47, 0x65, + 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x05, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, + 0x31, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x05, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x22, 0x2b, 0x0a, + 0x15, 0x53, 0x74, 0x61, 0x72, 0x74, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x22, 0x2b, 0x0a, 0x15, 0x47, 0x65, + 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x22, 0x44, 0x0a, 0x10, 0x55, 0x70, 0x6c, 0x6f, 0x61, + 0x64, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x64, + 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x69, 0x67, + 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x25, 0x0a, + 0x11, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x55, 0x52, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x75, 0x72, 0x6c, 0x22, 0xb8, 0x05, 0x0a, 0x0b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2f, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, + 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x07, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x12, 0x0a, + 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x74, 0x61, + 0x67, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x61, 0x74, + 0x5f, 0x69, 0x70, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x61, 0x74, 0x49, + 0x70, 0x73, 0x12, 0x15, 0x0a, 0x06, 0x6c, 0x62, 0x5f, 0x69, 0x70, 0x73, 0x18, 0x07, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x05, 0x6c, 0x62, 0x49, 0x70, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x72, 0x69, + 0x76, 0x61, 0x74, 0x65, 0x5f, 0x66, 0x71, 0x64, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x46, 0x71, 0x64, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, + 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x66, 0x71, 0x64, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x46, 0x71, 0x64, 0x6e, 0x12, 0x39, 0x0a, + 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0a, 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, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0b, 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, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x64, 0x41, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x7a, 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x7a, 0x6f, 0x6e, 0x65, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0d, + 0x75, 0x73, 0x65, 0x5f, 0x61, 0x63, 0x6d, 0x65, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x18, 0x0d, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0b, 0x75, 0x73, 0x65, 0x41, 0x63, 0x6d, 0x65, 0x43, 0x65, 0x72, 0x74, + 0x12, 0x30, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x1a, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0b, 0x6c, 0x62, 0x5f, 0x64, 0x6e, 0x73, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x62, 0x44, 0x6e, 0x73, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x73, 0x63, 0x61, 0x6c, + 0x69, 0x6e, 0x67, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x6f, 0x77, + 0x53, 0x63, 0x61, 0x6c, 0x69, 0x6e, 0x67, 0x12, 0x20, 0x0a, 0x0b, 0x68, 0x65, 0x61, 0x6c, 0x74, + 0x68, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x13, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x68, 0x65, + 0x61, 0x6c, 0x74, 0x68, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x2e, 0x0a, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, + 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, + 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x4a, 0x04, 0x08, 0x0e, 0x10, 0x0f, 0x22, + 0x3d, 0x0a, 0x07, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, + 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x3a, 0x02, 0x18, 0x01, 0x22, 0x55, + 0x0a, 0x0b, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x84, 0x01, 0x0a, 0x10, - 0x50, 0x75, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, - 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x12, 0x2c, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, - 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x22, 0x46, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, + 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x3a, 0x02, 0x18, 0x01, 0x22, 0x7a, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x12, 0x2c, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x18, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, + 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x39, 0x0a, 0x09, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4b, 0x65, 0x79, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x84, 0x01, 0x0a, + 0x10, 0x50, 0x75, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, + 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, + 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x2c, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, + 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x46, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6f, 0x2e, 0x64, + 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4b, + 0x65, 0x79, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x22, 0x44, 0x0a, 0x12, 0x47, + 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x2e, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, + 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x73, 0x22, 0x3c, 0x0a, 0x22, 0x47, 0x65, 0x74, 0x50, 0x6c, 0x61, 0x79, 0x67, 0x72, 0x6f, 0x75, + 0x6e, 0x64, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x22, + 0x49, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4b, 0x65, - 0x79, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x22, 0x44, 0x0a, 0x12, 0x47, 0x65, - 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x2e, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x14, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, - 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, - 0x22, 0x3c, 0x0a, 0x22, 0x47, 0x65, 0x74, 0x50, 0x6c, 0x61, 0x79, 0x67, 0x72, 0x6f, 0x75, 0x6e, - 0x64, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x22, 0x49, - 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x31, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, - 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4b, 0x65, 0x79, - 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x22, 0x2e, 0x0a, 0x12, 0x4c, 0x69, 0x73, - 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x48, 0x0a, 0x13, 0x4c, 0x69, 0x73, - 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x31, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, - 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4b, 0x65, 0x79, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x73, 0x22, 0xf6, 0x02, 0x0a, 0x0a, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, - 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x2b, 0x0a, 0x0f, - 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x76, 0x69, - 0x64, 0x65, 0x72, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x2e, 0x0a, 0x13, 0x70, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, - 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x12, 0x36, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, - 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x72, - 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, - 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, - 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x08, 0x70, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x50, 0x0a, 0x14, - 0x50, 0x75, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, - 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, - 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x7a, - 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x12, 0x30, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x1c, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, - 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, - 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x55, 0x0a, 0x17, 0x4c, 0x69, - 0x73, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x0b, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6f, 0x2e, - 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0b, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x22, 0xd4, 0x01, 0x0a, 0x0c, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x61, 0x75, - 0x74, 0x68, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x61, - 0x75, 0x74, 0x68, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x12, 0x1c, 0x0a, - 0x09, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x65, - 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x69, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x49, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x61, 0x6e, - 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x6e, 0x6f, - 0x6e, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x5f, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x66, 0x72, - 0x65, 0x73, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x57, 0x0a, 0x0d, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x63, 0x63, - 0x65, 0x73, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x23, 0x0a, 0x0d, - 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x22, 0x22, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 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, 0x22, 0x5f, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x16, 0x0a, 0x06, 0x66, 0x61, 0x62, 0x72, 0x69, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x66, 0x61, 0x62, 0x72, 0x69, 0x63, 0x12, 0x17, 0x0a, 0x07, 0x63, 0x6c, 0x69, 0x5f, - 0x6d, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x6c, 0x69, 0x4d, 0x69, - 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x75, 0x6c, 0x75, 0x6d, 0x69, 0x5f, 0x6d, 0x69, 0x6e, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x75, 0x6c, 0x75, 0x6d, 0x69, 0x4d, 0x69, 0x6e, - 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x22, 0xfa, 0x02, 0x0a, 0x0b, 0x54, 0x61, 0x69, 0x6c, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x12, 0x30, 0x0a, 0x05, 0x73, 0x69, 0x6e, 0x63, 0x65, 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, 0x05, 0x73, - 0x69, 0x6e, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x6c, 0x6f, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x6c, 0x6f, 0x67, 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, - 0x07, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x30, 0x0a, 0x05, 0x75, 0x6e, 0x74, 0x69, 0x6c, - 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, 0x05, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x6c, - 0x6c, 0x6f, 0x77, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, - 0x77, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x5a, 0x0a, 0x07, 0x4c, 0x6f, 0x67, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x18, 0x0a, 0x14, 0x4c, 0x4f, 0x47, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, - 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, - 0x4c, 0x4f, 0x47, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x44, 0x10, 0x01, 0x12, 0x12, 0x0a, - 0x0e, 0x4c, 0x4f, 0x47, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x10, - 0x02, 0x12, 0x10, 0x0a, 0x0c, 0x4c, 0x4f, 0x47, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x55, - 0x4e, 0x10, 0x04, 0x22, 0xb8, 0x01, 0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, - 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, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x79, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x22, 0x2e, 0x0a, 0x12, 0x4c, 0x69, + 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x48, 0x0a, 0x13, 0x4c, 0x69, + 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x31, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, + 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4b, 0x65, 0x79, 0x52, 0x07, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x73, 0x22, 0xf6, 0x02, 0x0a, 0x0a, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, + 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x2b, 0x0a, + 0x0f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x2e, 0x0a, 0x13, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, + 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, + 0x72, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x64, 0x65, 0x72, 0x72, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x73, 0x74, 0x64, 0x65, 0x72, 0x72, 0x12, 0x18, 0x0a, 0x07, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, - 0x73, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x22, 0x88, - 0x01, 0x0a, 0x0c, 0x54, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x30, 0x0a, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x16, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, - 0x4c, 0x6f, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, - 0x73, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x65, - 0x74, 0x61, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, 0x12, - 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, - 0x6f, 0x73, 0x74, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x22, 0xa1, 0x01, 0x0a, 0x13, 0x47, 0x65, - 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x35, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, - 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x61, 0x74, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x52, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x22, 0xfd, 0x02, - 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, - 0x35, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, - 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x61, 0x6c, 0x62, 0x5f, 0x61, 0x72, - 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x6c, 0x62, 0x41, 0x72, 0x6e, 0x12, - 0x1c, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x02, 0x18, 0x01, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x18, 0x0a, - 0x07, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, - 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x64, 0x5f, 0x76, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x64, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x30, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, - 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x6f, - 0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x32, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6f, 0x2e, - 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x72, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x36, 0x0a, 0x17, - 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x5f, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x15, 0x70, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, - 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x70, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x22, 0x3d, 0x0a, - 0x09, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, - 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x3a, 0x02, 0x18, 0x01, 0x22, 0x3a, 0x0a, 0x0a, - 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, - 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x5e, 0x0a, 0x06, 0x44, 0x65, 0x76, 0x69, - 0x63, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, - 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, - 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x72, 0x69, 0x76, 0x65, 0x72, 0x12, 0x14, - 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x3a, 0x02, 0x18, 0x01, 0x22, 0x6a, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x02, 0x52, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, - 0x63, 0x70, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x04, 0x63, 0x70, 0x75, 0x73, - 0x12, 0x2e, 0x0a, 0x07, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x14, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, - 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x07, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, - 0x3a, 0x02, 0x18, 0x01, 0x22, 0x4b, 0x0a, 0x09, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x73, 0x12, 0x3a, 0x0a, 0x0c, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, - 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, - 0x0c, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x3a, 0x02, 0x18, - 0x01, 0x22, 0x5f, 0x0a, 0x06, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x72, - 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x72, - 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, 0x35, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6f, 0x2e, - 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x73, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x3a, 0x02, - 0x18, 0x01, 0x22, 0x7e, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x12, 0x32, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, - 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x08, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x26, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, - 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x3a, 0x02, - 0x18, 0x01, 0x22, 0x24, 0x0a, 0x06, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x16, 0x0a, 0x06, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x3a, 0x02, 0x18, 0x01, 0x22, 0xe4, 0x01, 0x0a, 0x05, 0x42, 0x75, 0x69, - 0x6c, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x1e, 0x0a, 0x0a, - 0x64, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x64, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x31, 0x0a, 0x04, - 0x61, 0x72, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6f, 0x2e, - 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x2e, - 0x41, 0x72, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x61, 0x72, 0x67, 0x73, 0x12, - 0x19, 0x0a, 0x08, 0x73, 0x68, 0x6d, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x02, 0x52, 0x07, 0x73, 0x68, 0x6d, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x1a, 0x37, 0x0a, 0x09, 0x41, 0x72, 0x67, 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, 0x3a, 0x02, 0x18, 0x01, 0x22, - 0x75, 0x0a, 0x0b, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x12, - 0x0a, 0x04, 0x74, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x74, 0x65, - 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x18, - 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x74, 0x72, - 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x72, 0x65, 0x74, 0x72, 0x69, - 0x65, 0x73, 0x3a, 0x02, 0x18, 0x01, 0x22, 0xbe, 0x06, 0x0a, 0x07, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x32, 0x0a, 0x08, - 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, - 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6c, - 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x08, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, - 0x12, 0x1e, 0x0a, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x08, 0x42, 0x02, 0x18, 0x01, 0x52, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x12, 0x2c, 0x0a, 0x06, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x14, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, - 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x52, 0x06, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x12, 0x28, - 0x0a, 0x05, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, - 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6f, 0x72, - 0x74, 0x52, 0x05, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x48, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, - 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x12, 0x29, 0x0a, 0x05, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, - 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x05, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x2e, 0x0a, - 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, - 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, - 0x63, 0x72, 0x65, 0x74, 0x52, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x12, 0x3b, 0x0a, - 0x0b, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, - 0x31, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x0b, 0x68, - 0x65, 0x61, 0x6c, 0x74, 0x68, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x69, 0x74, 0x18, 0x0d, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x04, 0x69, 0x6e, 0x69, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x64, 0x6e, 0x73, 0x5f, - 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x64, 0x6e, 0x73, 0x52, - 0x6f, 0x6c, 0x65, 0x12, 0x3c, 0x0a, 0x0c, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x5f, 0x66, 0x69, - 0x6c, 0x65, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6f, 0x2e, 0x64, - 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x46, - 0x69, 0x6c, 0x65, 0x73, 0x52, 0x0b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x46, 0x69, 0x6c, 0x65, - 0x73, 0x12, 0x31, 0x0a, 0x08, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x18, 0x10, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, - 0x76, 0x31, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x08, 0x6e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x18, - 0x11, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x73, 0x12, 0x29, - 0x0a, 0x05, 0x72, 0x65, 0x64, 0x69, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, - 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x64, - 0x69, 0x73, 0x52, 0x05, 0x72, 0x65, 0x64, 0x69, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x18, 0x14, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x1a, 0x3e, 0x0a, 0x10, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 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, 0x3a, 0x02, 0x18, 0x01, 0x22, 0x47, 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x74, 0x69, - 0x63, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x12, 0x1c, - 0x0a, 0x09, 0x72, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x09, 0x72, 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x73, 0x3a, 0x02, 0x18, 0x01, - 0x22, 0x0b, 0x0a, 0x05, 0x52, 0x65, 0x64, 0x69, 0x73, 0x3a, 0x02, 0x18, 0x01, 0x22, 0xa3, 0x02, - 0x0a, 0x0b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x30, 0x0a, - 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x69, 0x6f, + 0x74, 0x61, 0x6d, 0x70, 0x12, 0x36, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, + 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, + 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, + 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, + 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x08, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x50, 0x0a, + 0x14, 0x50, 0x75, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, + 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6f, 0x2e, 0x64, + 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x22, + 0x7a, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x12, 0x30, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x1c, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, + 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x55, 0x0a, 0x17, 0x4c, + 0x69, 0x73, 0x74, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x0b, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, - 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, - 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, - 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x28, 0x0a, 0x0f, 0x64, - 0x61, 0x74, 0x61, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x61, 0x74, 0x61, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, - 0x2e, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x08, 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, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, - 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, - 0x61, 0x74, 0x61, 0x22, 0x91, 0x02, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x0a, - 0x0b, 0x73, 0x70, 0x65, 0x63, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x73, 0x70, 0x65, 0x63, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, - 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, - 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x28, 0x0a, 0x0f, 0x64, - 0x61, 0x74, 0x61, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x61, 0x74, 0x61, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, - 0x2e, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x08, 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, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, - 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, - 0x61, 0x74, 0x61, 0x3a, 0x02, 0x18, 0x01, 0x22, 0x3b, 0x0a, 0x0e, 0x50, 0x75, 0x62, 0x6c, 0x69, - 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x05, 0x65, 0x76, 0x65, - 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, - 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x65, - 0x76, 0x65, 0x6e, 0x74, 0x22, 0x5c, 0x0a, 0x10, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x22, 0xaa, 0x01, 0x0a, 0x11, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6f, 0x2e, 0x64, - 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x02, 0x18, 0x01, 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x30, 0x0a, - 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x69, - 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, - 0x2e, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x22, - 0x68, 0x0a, 0x1c, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x64, 0x6f, - 0x6d, 0x61, 0x69, 0x6e, 0x5a, 0x6f, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x2e, 0x0a, 0x13, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x72, - 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x6e, 0x61, - 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x12, - 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x33, 0x0a, 0x1d, 0x44, 0x65, 0x6c, - 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5a, 0x6f, - 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x7a, 0x6f, - 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x7a, 0x6f, 0x6e, 0x65, 0x22, 0x36, - 0x0a, 0x1a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x75, 0x62, 0x64, 0x6f, 0x6d, 0x61, 0x69, - 0x6e, 0x5a, 0x6f, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, + 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0b, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x22, 0xd4, 0x01, 0x0a, 0x0c, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x61, + 0x75, 0x74, 0x68, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x61, 0x75, 0x74, 0x68, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x70, + 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x12, 0x1c, + 0x0a, 0x09, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, + 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x69, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x49, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x61, + 0x6e, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x6e, + 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x5f, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x66, + 0x72, 0x65, 0x73, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x57, 0x0a, 0x0d, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x23, 0x0a, + 0x0d, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x22, 0x22, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 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, 0x22, 0x5f, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x61, 0x62, 0x72, 0x69, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x66, 0x61, 0x62, 0x72, 0x69, 0x63, 0x12, 0x17, 0x0a, 0x07, 0x63, 0x6c, 0x69, + 0x5f, 0x6d, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x6c, 0x69, 0x4d, + 0x69, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x75, 0x6c, 0x75, 0x6d, 0x69, 0x5f, 0x6d, 0x69, 0x6e, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x75, 0x6c, 0x75, 0x6d, 0x69, 0x4d, 0x69, + 0x6e, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x22, 0xfa, 0x02, 0x0a, 0x0b, 0x54, 0x61, 0x69, 0x6c, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x12, 0x30, 0x0a, 0x05, 0x73, 0x69, 0x6e, 0x63, 0x65, 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, 0x05, + 0x73, 0x69, 0x6e, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x6c, 0x6f, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x6c, 0x6f, 0x67, 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, + 0x0a, 0x07, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x70, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x30, 0x0a, 0x05, 0x75, 0x6e, 0x74, 0x69, + 0x6c, 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, 0x05, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x6f, + 0x6c, 0x6c, 0x6f, 0x77, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x66, 0x6f, 0x6c, 0x6c, + 0x6f, 0x77, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x5a, 0x0a, 0x07, 0x4c, 0x6f, 0x67, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x14, 0x4c, 0x4f, 0x47, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0f, 0x0a, + 0x0b, 0x4c, 0x4f, 0x47, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x44, 0x10, 0x01, 0x12, 0x12, + 0x0a, 0x0e, 0x4c, 0x4f, 0x47, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x42, 0x55, 0x49, 0x4c, 0x44, + 0x10, 0x02, 0x12, 0x10, 0x0a, 0x0c, 0x4c, 0x4f, 0x47, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, + 0x55, 0x4e, 0x10, 0x04, 0x22, 0xb8, 0x01, 0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x45, 0x6e, 0x74, 0x72, + 0x79, 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, 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, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x64, 0x65, 0x72, 0x72, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x73, 0x74, 0x64, 0x65, 0x72, 0x72, 0x12, 0x18, 0x0a, + 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x68, + 0x6f, 0x73, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x22, + 0x88, 0x01, 0x0a, 0x0c, 0x54, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x30, 0x0a, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x16, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, + 0x2e, 0x4c, 0x6f, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, + 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, + 0x65, 0x74, 0x61, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, + 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x68, 0x6f, 0x73, 0x74, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x22, 0xa1, 0x01, 0x0a, 0x13, 0x47, + 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, + 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x61, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x52, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, 0x74, 0x22, 0xfd, + 0x02, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x12, 0x35, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, + 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x61, 0x6c, 0x62, 0x5f, 0x61, + 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x61, 0x6c, 0x62, 0x41, 0x72, 0x6e, + 0x12, 0x1c, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x18, + 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x07, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x64, 0x5f, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x64, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x30, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, + 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x4d, + 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x32, 0x0a, 0x08, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6f, + 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x36, 0x0a, + 0x17, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, + 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x15, + 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, + 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, + 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x73, 0x22, 0x3a, + 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x8d, 0x01, 0x0a, 0x07, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x3a, 0x02, 0x18, 0x01, 0x4a, 0x04, + 0x08, 0x02, 0x10, 0x03, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, + 0x4a, 0x04, 0x08, 0x05, 0x10, 0x06, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x4a, 0x04, 0x08, 0x07, + 0x10, 0x08, 0x4a, 0x04, 0x08, 0x08, 0x10, 0x09, 0x4a, 0x04, 0x08, 0x09, 0x10, 0x0a, 0x4a, 0x04, + 0x08, 0x0a, 0x10, 0x0b, 0x4a, 0x04, 0x08, 0x0b, 0x10, 0x0c, 0x4a, 0x04, 0x08, 0x0c, 0x10, 0x0d, + 0x4a, 0x04, 0x08, 0x0d, 0x10, 0x0e, 0x4a, 0x04, 0x08, 0x0e, 0x10, 0x0f, 0x4a, 0x04, 0x08, 0x0f, + 0x10, 0x10, 0x4a, 0x04, 0x08, 0x10, 0x10, 0x11, 0x4a, 0x04, 0x08, 0x11, 0x10, 0x12, 0x4a, 0x04, + 0x08, 0x12, 0x10, 0x13, 0x4a, 0x04, 0x08, 0x14, 0x10, 0x15, 0x22, 0x91, 0x02, 0x0a, 0x05, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x73, 0x70, 0x65, 0x63, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x70, 0x65, 0x63, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, + 0x69, 0x64, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x61, 0x74, 0x61, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x61, 0x74, + 0x61, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1e, 0x0a, 0x0a, + 0x64, 0x61, 0x74, 0x61, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x18, 0x0a, 0x07, + 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, + 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x2e, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x08, + 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, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x3a, 0x02, 0x18, 0x01, 0x22, 0x3b, + 0x0a, 0x0e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x29, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x13, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x5c, 0x0a, 0x10, 0x53, + 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x65, + 0x74, 0x61, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, 0x12, + 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x22, 0xaa, 0x01, 0x0a, 0x11, 0x53, 0x75, + 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x37, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x19, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x02, 0x18, 0x01, 0x52, + 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x30, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, + 0x76, 0x31, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, + 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x2e, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x3b, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x44, 0x65, 0x6c, - 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5a, 0x6f, - 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, - 0x65, 0x63, 0x74, 0x22, 0x58, 0x0a, 0x11, 0x53, 0x65, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x74, 0x72, 0x61, 0x69, - 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x6f, 0x70, 0x74, 0x5f, 0x6f, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0e, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x4f, 0x70, 0x74, 0x4f, - 0x75, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x49, 0x64, 0x22, 0x84, 0x02, - 0x0a, 0x0e, 0x57, 0x68, 0x6f, 0x41, 0x6d, 0x49, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x16, 0x0a, 0x06, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x70, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x5f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x41, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, - 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, - 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x32, 0x0a, 0x04, 0x74, 0x69, 0x65, - 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, - 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x65, 0x72, 0x52, 0x04, 0x74, 0x69, 0x65, 0x72, 0x12, 0x28, 0x0a, - 0x10, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x6f, 0x70, 0x74, 0x5f, 0x6f, 0x75, - 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, - 0x67, 0x4f, 0x70, 0x74, 0x4f, 0x75, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x65, 0x6e, 0x61, 0x6e, - 0x74, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6e, 0x61, - 0x6e, 0x74, 0x49, 0x64, 0x22, 0x84, 0x01, 0x0a, 0x0f, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x32, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6f, 0x2e, - 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x72, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, - 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, - 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x75, 0x6c, 0x75, 0x6d, 0x69, 0x5f, 0x70, - 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x70, 0x75, - 0x6c, 0x75, 0x6d, 0x69, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x22, 0xa6, 0x01, 0x0a, 0x10, + 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x68, 0x0a, 0x1c, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, + 0x74, 0x65, 0x53, 0x75, 0x62, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5a, 0x6f, 0x6e, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x11, 0x6e, 0x61, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, + 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, + 0x22, 0x33, 0x0a, 0x1d, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x64, + 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5a, 0x6f, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x12, 0x0a, 0x04, 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x7a, 0x6f, 0x6e, 0x65, 0x22, 0x36, 0x0a, 0x1a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, + 0x75, 0x62, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5a, 0x6f, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x3b, 0x0a, + 0x1f, 0x47, 0x65, 0x74, 0x44, 0x65, 0x6c, 0x65, 0x67, 0x61, 0x74, 0x65, 0x53, 0x75, 0x62, 0x64, + 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5a, 0x6f, 0x6e, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x58, 0x0a, 0x11, 0x53, 0x65, + 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x28, 0x0a, 0x10, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x6f, 0x70, 0x74, 0x5f, + 0x6f, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x74, 0x72, 0x61, 0x69, 0x6e, + 0x69, 0x6e, 0x67, 0x4f, 0x70, 0x74, 0x4f, 0x75, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x6f, 0x64, + 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x6f, 0x64, + 0x65, 0x6c, 0x49, 0x64, 0x22, 0x84, 0x02, 0x0a, 0x0e, 0x57, 0x68, 0x6f, 0x41, 0x6d, 0x49, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x65, 0x6e, 0x61, 0x6e, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x12, + 0x2e, 0x0a, 0x13, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x61, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x70, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, + 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, + 0x12, 0x32, 0x0a, 0x04, 0x74, 0x69, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, + 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, + 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x65, 0x72, 0x52, 0x04, + 0x74, 0x69, 0x65, 0x72, 0x12, 0x28, 0x0a, 0x10, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, + 0x5f, 0x6f, 0x70, 0x74, 0x5f, 0x6f, 0x75, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, + 0x74, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x4f, 0x70, 0x74, 0x4f, 0x75, 0x74, 0x12, 0x1b, + 0x0a, 0x09, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x84, 0x01, 0x0a, 0x0f, + 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x32, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, + 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x0a, 0x0e, 0x70, + 0x75, 0x6c, 0x75, 0x6d, 0x69, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x70, 0x75, 0x6c, 0x75, 0x6d, 0x69, 0x50, 0x72, 0x65, 0x76, 0x69, + 0x65, 0x77, 0x22, 0xa6, 0x01, 0x0a, 0x10, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x4c, + 0x69, 0x6e, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x6e, 0x69, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x6e, 0x69, 0x74, 0x12, 0x1a, 0x0a, + 0x08, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, + 0x08, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x26, 0x0a, 0x04, 0x63, 0x6f, 0x73, + 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x04, 0x63, 0x6f, 0x73, + 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x05, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x22, 0xcd, 0x01, 0x0a, 0x10, + 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x32, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, + 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, + 0x69, 0x64, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x08, + 0x73, 0x75, 0x62, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, + 0x65, 0x79, 0x52, 0x08, 0x73, 0x75, 0x62, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x3d, 0x0a, 0x0a, + 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1e, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6e, 0x65, 0x49, 0x74, 0x65, 0x6d, - 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x6e, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x75, 0x6e, 0x69, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, - 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x08, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, - 0x74, 0x79, 0x12, 0x26, 0x0a, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, - 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x22, 0xcd, 0x01, 0x0a, 0x10, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x08, 0x70, 0x72, 0x6f, - 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6f, - 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, - 0x64, 0x65, 0x72, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x16, 0x0a, - 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, - 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x08, 0x73, 0x75, 0x62, 0x74, 0x6f, 0x74, 0x61, - 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4d, 0x6f, 0x6e, 0x65, 0x79, 0x52, 0x08, 0x73, 0x75, 0x62, - 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x3d, 0x0a, 0x0a, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x69, 0x74, - 0x65, 0x6d, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6f, 0x2e, 0x64, - 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, - 0x65, 0x4c, 0x69, 0x6e, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x09, 0x6c, 0x69, 0x6e, 0x65, 0x49, - 0x74, 0x65, 0x6d, 0x73, 0x22, 0xdf, 0x01, 0x0a, 0x0e, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x32, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, - 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6f, 0x2e, 0x64, - 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, - 0x72, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x72, - 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, - 0x69, 0x6f, 0x6e, 0x12, 0x30, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x52, 0x09, 0x6c, 0x69, 0x6e, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x22, 0xdf, 0x01, 0x0a, 0x0e, + 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x32, + 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x16, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, + 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, + 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x30, 0x0a, 0x04, 0x6d, 0x6f, + 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, + 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, + 0x6e, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, + 0x65, 0x74, 0x61, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, + 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x72, + 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x25, 0x0a, + 0x0f, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x65, 0x74, 0x61, 0x67, 0x22, 0x8d, 0x01, 0x0a, 0x16, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, + 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x38, 0x0a, 0x08, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, - 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x52, - 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, - 0x70, 0x6f, 0x73, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x70, - 0x6f, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x25, 0x0a, 0x0f, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, - 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x74, 0x61, - 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, 0x22, 0x8d, 0x01, - 0x0a, 0x16, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x08, 0x70, 0x6c, 0x61, 0x74, - 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x69, 0x6f, 0x2e, - 0x64, 0x65, 0x66, 0x61, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x08, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, - 0x72, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, - 0x75, 0x73, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, - 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x33, 0x0a, - 0x17, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x70, - 0x6f, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x70, 0x6f, - 0x73, 0x65, 0x2a, 0x54, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x18, - 0x0a, 0x14, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, 0x52, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, - 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x46, 0x41, - 0x4e, 0x47, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x57, 0x53, 0x10, 0x02, 0x12, 0x10, 0x0a, - 0x0c, 0x44, 0x49, 0x47, 0x49, 0x54, 0x41, 0x4c, 0x4f, 0x43, 0x45, 0x41, 0x4e, 0x10, 0x03, 0x12, - 0x07, 0x0a, 0x03, 0x47, 0x43, 0x50, 0x10, 0x04, 0x2a, 0x54, 0x0a, 0x0e, 0x44, 0x65, 0x70, 0x6c, - 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x10, 0x4d, 0x4f, - 0x44, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, - 0x12, 0x0f, 0x0a, 0x0b, 0x44, 0x45, 0x56, 0x45, 0x4c, 0x4f, 0x50, 0x4d, 0x45, 0x4e, 0x54, 0x10, - 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x54, 0x41, 0x47, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x0e, - 0x0a, 0x0a, 0x50, 0x52, 0x4f, 0x44, 0x55, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x03, 0x2a, 0xa3, - 0x02, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, - 0x11, 0x0a, 0x0d, 0x4e, 0x4f, 0x54, 0x5f, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, - 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x5f, 0x51, 0x55, 0x45, 0x55, - 0x45, 0x44, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x5f, 0x50, 0x52, - 0x4f, 0x56, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x11, 0x0a, 0x0d, - 0x42, 0x55, 0x49, 0x4c, 0x44, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x03, 0x12, - 0x14, 0x0a, 0x10, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x41, 0x54, - 0x49, 0x4e, 0x47, 0x10, 0x04, 0x12, 0x11, 0x0a, 0x0d, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x5f, 0x52, - 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x05, 0x12, 0x12, 0x0a, 0x0e, 0x42, 0x55, 0x49, 0x4c, - 0x44, 0x5f, 0x53, 0x54, 0x4f, 0x50, 0x50, 0x49, 0x4e, 0x47, 0x10, 0x06, 0x12, 0x11, 0x0a, 0x0d, - 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x5f, 0x51, 0x55, 0x45, 0x55, 0x45, 0x44, 0x10, 0x07, 0x12, - 0x16, 0x0a, 0x12, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x50, 0x45, - 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x08, 0x12, 0x18, 0x0a, 0x14, 0x44, 0x45, 0x50, 0x4c, 0x4f, - 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, - 0x09, 0x12, 0x15, 0x0a, 0x11, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x5f, - 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x0a, 0x12, 0x10, 0x0a, 0x0c, 0x42, 0x55, 0x49, 0x4c, - 0x44, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x0b, 0x12, 0x18, 0x0a, 0x14, 0x44, 0x45, - 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x43, 0x41, 0x4c, 0x45, 0x44, 0x5f, - 0x49, 0x4e, 0x10, 0x0c, 0x2a, 0x80, 0x07, 0x0a, 0x0c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1d, 0x0a, 0x19, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, - 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, - 0x45, 0x44, 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x49, 0x44, 0x45, 0x43, 0x41, 0x52, 0x10, 0x01, 0x12, - 0x20, 0x0a, 0x1c, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x44, 0x45, 0x46, 0x41, 0x4e, 0x47, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, - 0x64, 0x12, 0x1d, 0x0a, 0x19, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x44, 0x45, 0x46, 0x41, 0x4e, 0x47, 0x5f, 0x54, 0x41, 0x53, 0x4b, 0x10, 0x65, - 0x12, 0x2a, 0x0a, 0x25, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x41, 0x57, 0x53, 0x5f, 0x45, 0x43, 0x53, 0x5f, 0x46, 0x41, 0x52, 0x47, 0x41, 0x54, - 0x45, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, 0xc8, 0x01, 0x12, 0x27, 0x0a, 0x22, - 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x57, - 0x53, 0x5f, 0x45, 0x43, 0x53, 0x5f, 0x46, 0x41, 0x52, 0x47, 0x41, 0x54, 0x45, 0x5f, 0x54, 0x41, - 0x53, 0x4b, 0x10, 0xc9, 0x01, 0x12, 0x26, 0x0a, 0x21, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, - 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x57, 0x53, 0x5f, 0x45, 0x43, 0x53, 0x5f, 0x45, - 0x43, 0x32, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, 0xca, 0x01, 0x12, 0x23, 0x0a, - 0x1e, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, - 0x57, 0x53, 0x5f, 0x52, 0x44, 0x53, 0x5f, 0x50, 0x4f, 0x53, 0x54, 0x47, 0x52, 0x45, 0x53, 0x10, - 0xd2, 0x01, 0x12, 0x28, 0x0a, 0x23, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x41, 0x57, 0x53, 0x5f, 0x45, 0x4c, 0x41, 0x53, 0x54, 0x49, 0x43, 0x41, - 0x43, 0x48, 0x45, 0x5f, 0x52, 0x45, 0x44, 0x49, 0x53, 0x10, 0xdc, 0x01, 0x12, 0x29, 0x0a, 0x24, + 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x52, + 0x08, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, + 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x25, 0x0a, + 0x0e, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x22, 0x33, 0x0a, 0x17, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, + 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x65, 0x2a, 0x54, 0x0a, 0x08, 0x50, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x14, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x44, 0x45, + 0x52, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, + 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x46, 0x41, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x41, + 0x57, 0x53, 0x10, 0x02, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x49, 0x47, 0x49, 0x54, 0x41, 0x4c, 0x4f, + 0x43, 0x45, 0x41, 0x4e, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x47, 0x43, 0x50, 0x10, 0x04, 0x2a, + 0x54, 0x0a, 0x0e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x6f, 0x64, + 0x65, 0x12, 0x14, 0x0a, 0x10, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, + 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x44, 0x45, 0x56, 0x45, 0x4c, + 0x4f, 0x50, 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x54, 0x41, 0x47, + 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x50, 0x52, 0x4f, 0x44, 0x55, 0x43, 0x54, + 0x49, 0x4f, 0x4e, 0x10, 0x03, 0x2a, 0xa3, 0x02, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x11, 0x0a, 0x0d, 0x4e, 0x4f, 0x54, 0x5f, 0x53, 0x50, + 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x42, 0x55, 0x49, + 0x4c, 0x44, 0x5f, 0x51, 0x55, 0x45, 0x55, 0x45, 0x44, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x42, + 0x55, 0x49, 0x4c, 0x44, 0x5f, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x49, 0x4e, + 0x47, 0x10, 0x02, 0x12, 0x11, 0x0a, 0x0d, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x5f, 0x50, 0x45, 0x4e, + 0x44, 0x49, 0x4e, 0x47, 0x10, 0x03, 0x12, 0x14, 0x0a, 0x10, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x5f, + 0x41, 0x43, 0x54, 0x49, 0x56, 0x41, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x04, 0x12, 0x11, 0x0a, 0x0d, + 0x42, 0x55, 0x49, 0x4c, 0x44, 0x5f, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x05, 0x12, + 0x12, 0x0a, 0x0e, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x5f, 0x53, 0x54, 0x4f, 0x50, 0x50, 0x49, 0x4e, + 0x47, 0x10, 0x06, 0x12, 0x11, 0x0a, 0x0d, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x5f, 0x51, 0x55, + 0x45, 0x55, 0x45, 0x44, 0x10, 0x07, 0x12, 0x16, 0x0a, 0x12, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, + 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x50, 0x45, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x08, 0x12, 0x18, + 0x0a, 0x14, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x43, 0x4f, 0x4d, + 0x50, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x09, 0x12, 0x15, 0x0a, 0x11, 0x44, 0x45, 0x50, 0x4c, + 0x4f, 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x0a, 0x12, + 0x10, 0x0a, 0x0c, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, + 0x0b, 0x12, 0x18, 0x0a, 0x14, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x5f, + 0x53, 0x43, 0x41, 0x4c, 0x45, 0x44, 0x5f, 0x49, 0x4e, 0x10, 0x0c, 0x2a, 0x80, 0x07, 0x0a, 0x0c, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1d, 0x0a, 0x19, + 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, + 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15, 0x52, + 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x49, 0x44, + 0x45, 0x43, 0x41, 0x52, 0x10, 0x01, 0x12, 0x20, 0x0a, 0x1c, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, + 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x45, 0x46, 0x41, 0x4e, 0x47, 0x5f, 0x53, + 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, 0x64, 0x12, 0x1d, 0x0a, 0x19, 0x52, 0x45, 0x53, 0x4f, + 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x45, 0x46, 0x41, 0x4e, 0x47, + 0x5f, 0x54, 0x41, 0x53, 0x4b, 0x10, 0x65, 0x12, 0x2a, 0x0a, 0x25, 0x52, 0x45, 0x53, 0x4f, 0x55, + 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x57, 0x53, 0x5f, 0x45, 0x43, 0x53, + 0x5f, 0x46, 0x41, 0x52, 0x47, 0x41, 0x54, 0x45, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, + 0x10, 0xc8, 0x01, 0x12, 0x27, 0x0a, 0x22, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x57, 0x53, 0x5f, 0x45, 0x43, 0x53, 0x5f, 0x46, 0x41, 0x52, + 0x47, 0x41, 0x54, 0x45, 0x5f, 0x54, 0x41, 0x53, 0x4b, 0x10, 0xc9, 0x01, 0x12, 0x26, 0x0a, 0x21, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x57, - 0x53, 0x5f, 0x45, 0x4c, 0x41, 0x53, 0x54, 0x49, 0x43, 0x41, 0x43, 0x48, 0x45, 0x5f, 0x56, 0x41, - 0x4c, 0x4b, 0x45, 0x59, 0x10, 0xdd, 0x01, 0x12, 0x21, 0x0a, 0x1c, 0x52, 0x45, 0x53, 0x4f, 0x55, - 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x57, 0x53, 0x5f, 0x44, 0x4f, 0x43, - 0x55, 0x4d, 0x45, 0x4e, 0x54, 0x44, 0x42, 0x10, 0xe6, 0x01, 0x12, 0x24, 0x0a, 0x1f, 0x52, 0x45, - 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x57, 0x53, 0x5f, - 0x43, 0x4c, 0x4f, 0x55, 0x44, 0x46, 0x52, 0x4f, 0x4e, 0x54, 0x5f, 0x53, 0x33, 0x10, 0xf0, 0x01, - 0x12, 0x1e, 0x0a, 0x19, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x41, 0x57, 0x53, 0x5f, 0x42, 0x45, 0x44, 0x52, 0x4f, 0x43, 0x4b, 0x10, 0xfa, 0x01, - 0x12, 0x21, 0x0a, 0x1c, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x44, 0x4f, 0x5f, 0x41, 0x50, 0x50, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, - 0x10, 0xac, 0x02, 0x12, 0x1d, 0x0a, 0x18, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, - 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x4f, 0x5f, 0x41, 0x50, 0x50, 0x5f, 0x4a, 0x4f, 0x42, 0x10, - 0xad, 0x02, 0x12, 0x21, 0x0a, 0x1c, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x44, 0x4f, 0x5f, 0x44, 0x42, 0x5f, 0x50, 0x4f, 0x53, 0x54, 0x47, 0x52, - 0x45, 0x53, 0x10, 0xb6, 0x02, 0x12, 0x1f, 0x0a, 0x1a, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, - 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x4f, 0x5f, 0x44, 0x42, 0x5f, 0x56, 0x41, 0x4c, - 0x4b, 0x45, 0x59, 0x10, 0xb7, 0x02, 0x12, 0x27, 0x0a, 0x22, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, + 0x53, 0x5f, 0x45, 0x43, 0x53, 0x5f, 0x45, 0x43, 0x32, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, + 0x45, 0x10, 0xca, 0x01, 0x12, 0x23, 0x0a, 0x1e, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x57, 0x53, 0x5f, 0x52, 0x44, 0x53, 0x5f, 0x50, 0x4f, + 0x53, 0x54, 0x47, 0x52, 0x45, 0x53, 0x10, 0xd2, 0x01, 0x12, 0x28, 0x0a, 0x23, 0x52, 0x45, 0x53, + 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x57, 0x53, 0x5f, 0x45, + 0x4c, 0x41, 0x53, 0x54, 0x49, 0x43, 0x41, 0x43, 0x48, 0x45, 0x5f, 0x52, 0x45, 0x44, 0x49, 0x53, + 0x10, 0xdc, 0x01, 0x12, 0x29, 0x0a, 0x24, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x57, 0x53, 0x5f, 0x45, 0x4c, 0x41, 0x53, 0x54, 0x49, 0x43, + 0x41, 0x43, 0x48, 0x45, 0x5f, 0x56, 0x41, 0x4c, 0x4b, 0x45, 0x59, 0x10, 0xdd, 0x01, 0x12, 0x21, + 0x0a, 0x1c, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x41, 0x57, 0x53, 0x5f, 0x44, 0x4f, 0x43, 0x55, 0x4d, 0x45, 0x4e, 0x54, 0x44, 0x42, 0x10, 0xe6, + 0x01, 0x12, 0x24, 0x0a, 0x1f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x41, 0x57, 0x53, 0x5f, 0x43, 0x4c, 0x4f, 0x55, 0x44, 0x46, 0x52, 0x4f, 0x4e, + 0x54, 0x5f, 0x53, 0x33, 0x10, 0xf0, 0x01, 0x12, 0x1e, 0x0a, 0x19, 0x52, 0x45, 0x53, 0x4f, 0x55, + 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x57, 0x53, 0x5f, 0x42, 0x45, 0x44, + 0x52, 0x4f, 0x43, 0x4b, 0x10, 0xfa, 0x01, 0x12, 0x21, 0x0a, 0x1c, 0x52, 0x45, 0x53, 0x4f, 0x55, + 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x4f, 0x5f, 0x41, 0x50, 0x50, 0x5f, + 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, 0xac, 0x02, 0x12, 0x1d, 0x0a, 0x18, 0x52, 0x45, + 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x4f, 0x5f, 0x41, + 0x50, 0x50, 0x5f, 0x4a, 0x4f, 0x42, 0x10, 0xad, 0x02, 0x12, 0x21, 0x0a, 0x1c, 0x52, 0x45, 0x53, + 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x4f, 0x5f, 0x44, 0x42, + 0x5f, 0x50, 0x4f, 0x53, 0x54, 0x47, 0x52, 0x45, 0x53, 0x10, 0xb6, 0x02, 0x12, 0x1f, 0x0a, 0x1a, + 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x44, 0x4f, + 0x5f, 0x44, 0x42, 0x5f, 0x56, 0x41, 0x4c, 0x4b, 0x45, 0x59, 0x10, 0xb7, 0x02, 0x12, 0x27, 0x0a, + 0x22, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x47, + 0x43, 0x50, 0x5f, 0x43, 0x4c, 0x4f, 0x55, 0x44, 0x52, 0x55, 0x4e, 0x5f, 0x53, 0x45, 0x52, 0x56, + 0x49, 0x43, 0x45, 0x10, 0x90, 0x03, 0x12, 0x23, 0x0a, 0x1e, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x47, 0x43, 0x50, 0x5f, 0x43, 0x4c, 0x4f, 0x55, - 0x44, 0x52, 0x55, 0x4e, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, 0x90, 0x03, 0x12, - 0x23, 0x0a, 0x1e, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x47, 0x43, 0x50, 0x5f, 0x43, 0x4c, 0x4f, 0x55, 0x44, 0x52, 0x55, 0x4e, 0x5f, 0x4a, 0x4f, - 0x42, 0x10, 0x91, 0x03, 0x12, 0x2d, 0x0a, 0x28, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x47, 0x43, 0x50, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x55, 0x54, - 0x45, 0x5f, 0x45, 0x4e, 0x47, 0x49, 0x4e, 0x45, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, - 0x10, 0x9a, 0x03, 0x12, 0x28, 0x0a, 0x23, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, - 0x54, 0x59, 0x50, 0x45, 0x5f, 0x47, 0x43, 0x50, 0x5f, 0x43, 0x4c, 0x4f, 0x55, 0x44, 0x53, 0x51, - 0x4c, 0x5f, 0x50, 0x4f, 0x53, 0x54, 0x47, 0x52, 0x45, 0x53, 0x10, 0xa4, 0x03, 0x12, 0x22, 0x0a, - 0x1d, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x47, - 0x43, 0x50, 0x5f, 0x4d, 0x45, 0x4d, 0x4f, 0x52, 0x59, 0x53, 0x54, 0x4f, 0x52, 0x45, 0x10, 0xae, - 0x03, 0x12, 0x1f, 0x0a, 0x1a, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x47, 0x43, 0x50, 0x5f, 0x56, 0x45, 0x52, 0x54, 0x45, 0x58, 0x41, 0x49, 0x10, - 0xb8, 0x03, 0x12, 0x23, 0x0a, 0x1e, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x47, 0x43, 0x50, 0x5f, 0x46, 0x49, 0x52, 0x45, 0x53, 0x54, 0x4f, 0x52, - 0x45, 0x5f, 0x44, 0x42, 0x10, 0xc2, 0x03, 0x2a, 0x42, 0x0a, 0x0a, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x16, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, - 0x00, 0x12, 0x18, 0x0a, 0x14, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x54, 0x59, 0x50, 0x45, 0x5f, - 0x53, 0x45, 0x4e, 0x53, 0x49, 0x54, 0x49, 0x56, 0x45, 0x10, 0x01, 0x2a, 0x6a, 0x0a, 0x0e, 0x44, - 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, 0x0a, - 0x1b, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1b, - 0x0a, 0x17, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x48, 0x49, 0x53, 0x54, 0x4f, 0x52, 0x59, 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x44, - 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, - 0x43, 0x54, 0x49, 0x56, 0x45, 0x10, 0x02, 0x2a, 0x8a, 0x01, 0x0a, 0x10, 0x44, 0x65, 0x70, 0x6c, - 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x1d, + 0x44, 0x52, 0x55, 0x4e, 0x5f, 0x4a, 0x4f, 0x42, 0x10, 0x91, 0x03, 0x12, 0x2d, 0x0a, 0x28, 0x52, + 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x47, 0x43, 0x50, + 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x55, 0x54, 0x45, 0x5f, 0x45, 0x4e, 0x47, 0x49, 0x4e, 0x45, 0x5f, + 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, 0x9a, 0x03, 0x12, 0x28, 0x0a, 0x23, 0x52, 0x45, + 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x47, 0x43, 0x50, 0x5f, + 0x43, 0x4c, 0x4f, 0x55, 0x44, 0x53, 0x51, 0x4c, 0x5f, 0x50, 0x4f, 0x53, 0x54, 0x47, 0x52, 0x45, + 0x53, 0x10, 0xa4, 0x03, 0x12, 0x22, 0x0a, 0x1d, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x47, 0x43, 0x50, 0x5f, 0x4d, 0x45, 0x4d, 0x4f, 0x52, 0x59, + 0x53, 0x54, 0x4f, 0x52, 0x45, 0x10, 0xae, 0x03, 0x12, 0x1f, 0x0a, 0x1a, 0x52, 0x45, 0x53, 0x4f, + 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x47, 0x43, 0x50, 0x5f, 0x56, 0x45, + 0x52, 0x54, 0x45, 0x58, 0x41, 0x49, 0x10, 0xb8, 0x03, 0x12, 0x23, 0x0a, 0x1e, 0x52, 0x45, 0x53, + 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x47, 0x43, 0x50, 0x5f, 0x46, + 0x49, 0x52, 0x45, 0x53, 0x54, 0x4f, 0x52, 0x45, 0x5f, 0x44, 0x42, 0x10, 0xc2, 0x03, 0x2a, 0x42, + 0x0a, 0x0a, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x16, + 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, + 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x43, 0x4f, 0x4e, 0x46, + 0x49, 0x47, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x45, 0x4e, 0x53, 0x49, 0x54, 0x49, 0x56, 0x45, + 0x10, 0x01, 0x2a, 0x6a, 0x0a, 0x0e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x1b, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, + 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, + 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1b, 0x0a, 0x17, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, + 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x48, 0x49, 0x53, 0x54, 0x4f, 0x52, 0x59, + 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, 0x4e, 0x54, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x10, 0x02, 0x2a, 0x8a, + 0x01, 0x0a, 0x10, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x1d, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, 0x4e, + 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, + 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, + 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x50, 0x10, 0x01, + 0x12, 0x1a, 0x0a, 0x16, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x41, + 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x4f, 0x57, 0x4e, 0x10, 0x02, 0x12, 0x1d, 0x0a, 0x19, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, - 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, - 0x18, 0x0a, 0x14, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x41, 0x43, - 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x50, 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x44, 0x45, 0x50, - 0x4c, 0x4f, 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, - 0x4f, 0x57, 0x4e, 0x10, 0x02, 0x12, 0x1d, 0x0a, 0x19, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, - 0x45, 0x4e, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x52, 0x45, 0x56, 0x49, - 0x45, 0x57, 0x10, 0x03, 0x2a, 0x3f, 0x0a, 0x08, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, - 0x12, 0x0f, 0x0a, 0x0b, 0x4c, 0x49, 0x4e, 0x55, 0x58, 0x5f, 0x41, 0x4d, 0x44, 0x36, 0x34, 0x10, - 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x4c, 0x49, 0x4e, 0x55, 0x58, 0x5f, 0x41, 0x52, 0x4d, 0x36, 0x34, - 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x4c, 0x49, 0x4e, 0x55, 0x58, 0x5f, 0x41, 0x4e, 0x59, 0x10, - 0x02, 0x1a, 0x02, 0x18, 0x01, 0x2a, 0x48, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, - 0x6c, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4e, 0x59, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x55, 0x44, - 0x50, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x43, 0x50, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, - 0x48, 0x54, 0x54, 0x50, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x48, 0x54, 0x54, 0x50, 0x32, 0x10, - 0x04, 0x12, 0x08, 0x0a, 0x04, 0x47, 0x52, 0x50, 0x43, 0x10, 0x05, 0x1a, 0x02, 0x18, 0x01, 0x2a, - 0x21, 0x0a, 0x04, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x48, 0x4f, 0x53, 0x54, 0x10, - 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x49, 0x4e, 0x47, 0x52, 0x45, 0x53, 0x53, 0x10, 0x01, 0x1a, 0x02, - 0x18, 0x01, 0x2a, 0x37, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x0f, 0x0a, - 0x0b, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0b, - 0x0a, 0x07, 0x50, 0x52, 0x49, 0x56, 0x41, 0x54, 0x45, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x50, - 0x55, 0x42, 0x4c, 0x49, 0x43, 0x10, 0x02, 0x1a, 0x02, 0x18, 0x01, 0x2a, 0x61, 0x0a, 0x10, 0x53, + 0x4e, 0x5f, 0x50, 0x52, 0x45, 0x56, 0x49, 0x45, 0x57, 0x10, 0x03, 0x2a, 0x61, 0x0a, 0x10, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x1d, 0x53, 0x55, 0x42, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x49, 0x45, 0x52, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, @@ -7091,8 +5870,8 @@ func file_io_defang_v1_fabric_proto_rawDescGZIP() []byte { return file_io_defang_v1_fabric_proto_rawDescData } -var file_io_defang_v1_fabric_proto_enumTypes = make([]protoimpl.EnumInfo, 14) -var file_io_defang_v1_fabric_proto_msgTypes = make([]protoimpl.MessageInfo, 84) +var file_io_defang_v1_fabric_proto_enumTypes = make([]protoimpl.EnumInfo, 10) +var file_io_defang_v1_fabric_proto_msgTypes = make([]protoimpl.MessageInfo, 70) var file_io_defang_v1_fabric_proto_goTypes = []any{ (Provider)(0), // 0: io.defang.v1.Provider (DeploymentMode)(0), // 1: io.defang.v1.DeploymentMode @@ -7101,266 +5880,229 @@ var file_io_defang_v1_fabric_proto_goTypes = []any{ (ConfigType)(0), // 4: io.defang.v1.ConfigType (DeploymentType)(0), // 5: io.defang.v1.DeploymentType (DeploymentAction)(0), // 6: io.defang.v1.DeploymentAction - (Platform)(0), // 7: io.defang.v1.Platform - (Protocol)(0), // 8: io.defang.v1.Protocol - (Mode)(0), // 9: io.defang.v1.Mode - (Network)(0), // 10: io.defang.v1.Network - (SubscriptionTier)(0), // 11: io.defang.v1.SubscriptionTier - (SourcePlatform)(0), // 12: io.defang.v1.SourcePlatform - (TailRequest_LogType)(0), // 13: io.defang.v1.TailRequest.LogType - (*GetSelectedProviderRequest)(nil), // 14: io.defang.v1.GetSelectedProviderRequest - (*GetSelectedProviderResponse)(nil), // 15: io.defang.v1.GetSelectedProviderResponse - (*SetSelectedProviderRequest)(nil), // 16: io.defang.v1.SetSelectedProviderRequest - (*VerifyDNSSetupRequest)(nil), // 17: io.defang.v1.VerifyDNSSetupRequest - (*DestroyRequest)(nil), // 18: io.defang.v1.DestroyRequest - (*DestroyResponse)(nil), // 19: io.defang.v1.DestroyResponse - (*DebugRequest)(nil), // 20: io.defang.v1.DebugRequest - (*DebugResponse)(nil), // 21: io.defang.v1.DebugResponse - (*Issue)(nil), // 22: io.defang.v1.Issue - (*CodeChange)(nil), // 23: io.defang.v1.CodeChange - (*TrackRequest)(nil), // 24: io.defang.v1.TrackRequest - (*CanIUseRequest)(nil), // 25: io.defang.v1.CanIUseRequest - (*CanIUseResponse)(nil), // 26: io.defang.v1.CanIUseResponse - (*DeployRequest)(nil), // 27: io.defang.v1.DeployRequest - (*DeployResponse)(nil), // 28: io.defang.v1.DeployResponse - (*DeleteRequest)(nil), // 29: io.defang.v1.DeleteRequest - (*DeleteResponse)(nil), // 30: io.defang.v1.DeleteResponse - (*GenerateFilesRequest)(nil), // 31: io.defang.v1.GenerateFilesRequest - (*File)(nil), // 32: io.defang.v1.File - (*GenerateFilesResponse)(nil), // 33: io.defang.v1.GenerateFilesResponse - (*StartGenerateResponse)(nil), // 34: io.defang.v1.StartGenerateResponse - (*GenerateStatusRequest)(nil), // 35: io.defang.v1.GenerateStatusRequest - (*UploadURLRequest)(nil), // 36: io.defang.v1.UploadURLRequest - (*UploadURLResponse)(nil), // 37: io.defang.v1.UploadURLResponse - (*ServiceInfo)(nil), // 38: io.defang.v1.ServiceInfo - (*Secrets)(nil), // 39: io.defang.v1.Secrets - (*SecretValue)(nil), // 40: io.defang.v1.SecretValue - (*Config)(nil), // 41: io.defang.v1.Config - (*ConfigKey)(nil), // 42: io.defang.v1.ConfigKey - (*PutConfigRequest)(nil), // 43: io.defang.v1.PutConfigRequest - (*GetConfigsRequest)(nil), // 44: io.defang.v1.GetConfigsRequest - (*GetConfigsResponse)(nil), // 45: io.defang.v1.GetConfigsResponse - (*GetPlaygroundProjectDomainResponse)(nil), // 46: io.defang.v1.GetPlaygroundProjectDomainResponse - (*DeleteConfigsRequest)(nil), // 47: io.defang.v1.DeleteConfigsRequest - (*ListConfigsRequest)(nil), // 48: io.defang.v1.ListConfigsRequest - (*ListConfigsResponse)(nil), // 49: io.defang.v1.ListConfigsResponse - (*Deployment)(nil), // 50: io.defang.v1.Deployment - (*PutDeploymentRequest)(nil), // 51: io.defang.v1.PutDeploymentRequest - (*ListDeploymentsRequest)(nil), // 52: io.defang.v1.ListDeploymentsRequest - (*ListDeploymentsResponse)(nil), // 53: io.defang.v1.ListDeploymentsResponse - (*TokenRequest)(nil), // 54: io.defang.v1.TokenRequest - (*TokenResponse)(nil), // 55: io.defang.v1.TokenResponse - (*Status)(nil), // 56: io.defang.v1.Status - (*Version)(nil), // 57: io.defang.v1.Version - (*TailRequest)(nil), // 58: io.defang.v1.TailRequest - (*LogEntry)(nil), // 59: io.defang.v1.LogEntry - (*TailResponse)(nil), // 60: io.defang.v1.TailResponse - (*GetServicesResponse)(nil), // 61: io.defang.v1.GetServicesResponse - (*ProjectUpdate)(nil), // 62: io.defang.v1.ProjectUpdate - (*ServiceID)(nil), // 63: io.defang.v1.ServiceID - (*GetRequest)(nil), // 64: io.defang.v1.GetRequest - (*Device)(nil), // 65: io.defang.v1.Device - (*Resource)(nil), // 66: io.defang.v1.Resource - (*Resources)(nil), // 67: io.defang.v1.Resources - (*Deploy)(nil), // 68: io.defang.v1.Deploy - (*Port)(nil), // 69: io.defang.v1.Port - (*Secret)(nil), // 70: io.defang.v1.Secret - (*Build)(nil), // 71: io.defang.v1.Build - (*HealthCheck)(nil), // 72: io.defang.v1.HealthCheck - (*Service)(nil), // 73: io.defang.v1.Service - (*StaticFiles)(nil), // 74: io.defang.v1.StaticFiles - (*Redis)(nil), // 75: io.defang.v1.Redis - (*DeployEvent)(nil), // 76: io.defang.v1.DeployEvent - (*Event)(nil), // 77: io.defang.v1.Event - (*PublishRequest)(nil), // 78: io.defang.v1.PublishRequest - (*SubscribeRequest)(nil), // 79: io.defang.v1.SubscribeRequest - (*SubscribeResponse)(nil), // 80: io.defang.v1.SubscribeResponse - (*GetServicesRequest)(nil), // 81: io.defang.v1.GetServicesRequest - (*DelegateSubdomainZoneRequest)(nil), // 82: io.defang.v1.DelegateSubdomainZoneRequest - (*DelegateSubdomainZoneResponse)(nil), // 83: io.defang.v1.DelegateSubdomainZoneResponse - (*DeleteSubdomainZoneRequest)(nil), // 84: io.defang.v1.DeleteSubdomainZoneRequest - (*GetDelegateSubdomainZoneRequest)(nil), // 85: io.defang.v1.GetDelegateSubdomainZoneRequest - (*SetOptionsRequest)(nil), // 86: io.defang.v1.SetOptionsRequest - (*WhoAmIResponse)(nil), // 87: io.defang.v1.WhoAmIResponse - (*EstimateRequest)(nil), // 88: io.defang.v1.EstimateRequest - (*EstimateLineItem)(nil), // 89: io.defang.v1.EstimateLineItem - (*EstimateResponse)(nil), // 90: io.defang.v1.EstimateResponse - (*PreviewRequest)(nil), // 91: io.defang.v1.PreviewRequest - (*PreviewResponse)(nil), // 92: io.defang.v1.PreviewResponse - (*GenerateComposeRequest)(nil), // 93: io.defang.v1.GenerateComposeRequest - (*GenerateComposeResponse)(nil), // 94: io.defang.v1.GenerateComposeResponse - nil, // 95: io.defang.v1.TrackRequest.PropertiesEntry - nil, // 96: io.defang.v1.Build.ArgsEntry - nil, // 97: io.defang.v1.Service.EnvironmentEntry - (*timestamppb.Timestamp)(nil), // 98: google.protobuf.Timestamp - (*_type.Money)(nil), // 99: google.type.Money - (*emptypb.Empty)(nil), // 100: google.protobuf.Empty + (SubscriptionTier)(0), // 7: io.defang.v1.SubscriptionTier + (SourcePlatform)(0), // 8: io.defang.v1.SourcePlatform + (TailRequest_LogType)(0), // 9: io.defang.v1.TailRequest.LogType + (*GetSelectedProviderRequest)(nil), // 10: io.defang.v1.GetSelectedProviderRequest + (*GetSelectedProviderResponse)(nil), // 11: io.defang.v1.GetSelectedProviderResponse + (*SetSelectedProviderRequest)(nil), // 12: io.defang.v1.SetSelectedProviderRequest + (*VerifyDNSSetupRequest)(nil), // 13: io.defang.v1.VerifyDNSSetupRequest + (*DestroyRequest)(nil), // 14: io.defang.v1.DestroyRequest + (*DestroyResponse)(nil), // 15: io.defang.v1.DestroyResponse + (*DebugRequest)(nil), // 16: io.defang.v1.DebugRequest + (*DebugResponse)(nil), // 17: io.defang.v1.DebugResponse + (*Issue)(nil), // 18: io.defang.v1.Issue + (*CodeChange)(nil), // 19: io.defang.v1.CodeChange + (*TrackRequest)(nil), // 20: io.defang.v1.TrackRequest + (*CanIUseRequest)(nil), // 21: io.defang.v1.CanIUseRequest + (*CanIUseResponse)(nil), // 22: io.defang.v1.CanIUseResponse + (*DeployRequest)(nil), // 23: io.defang.v1.DeployRequest + (*DeployResponse)(nil), // 24: io.defang.v1.DeployResponse + (*DeleteRequest)(nil), // 25: io.defang.v1.DeleteRequest + (*DeleteResponse)(nil), // 26: io.defang.v1.DeleteResponse + (*GenerateFilesRequest)(nil), // 27: io.defang.v1.GenerateFilesRequest + (*File)(nil), // 28: io.defang.v1.File + (*GenerateFilesResponse)(nil), // 29: io.defang.v1.GenerateFilesResponse + (*StartGenerateResponse)(nil), // 30: io.defang.v1.StartGenerateResponse + (*GenerateStatusRequest)(nil), // 31: io.defang.v1.GenerateStatusRequest + (*UploadURLRequest)(nil), // 32: io.defang.v1.UploadURLRequest + (*UploadURLResponse)(nil), // 33: io.defang.v1.UploadURLResponse + (*ServiceInfo)(nil), // 34: io.defang.v1.ServiceInfo + (*Secrets)(nil), // 35: io.defang.v1.Secrets + (*SecretValue)(nil), // 36: io.defang.v1.SecretValue + (*Config)(nil), // 37: io.defang.v1.Config + (*ConfigKey)(nil), // 38: io.defang.v1.ConfigKey + (*PutConfigRequest)(nil), // 39: io.defang.v1.PutConfigRequest + (*GetConfigsRequest)(nil), // 40: io.defang.v1.GetConfigsRequest + (*GetConfigsResponse)(nil), // 41: io.defang.v1.GetConfigsResponse + (*GetPlaygroundProjectDomainResponse)(nil), // 42: io.defang.v1.GetPlaygroundProjectDomainResponse + (*DeleteConfigsRequest)(nil), // 43: io.defang.v1.DeleteConfigsRequest + (*ListConfigsRequest)(nil), // 44: io.defang.v1.ListConfigsRequest + (*ListConfigsResponse)(nil), // 45: io.defang.v1.ListConfigsResponse + (*Deployment)(nil), // 46: io.defang.v1.Deployment + (*PutDeploymentRequest)(nil), // 47: io.defang.v1.PutDeploymentRequest + (*ListDeploymentsRequest)(nil), // 48: io.defang.v1.ListDeploymentsRequest + (*ListDeploymentsResponse)(nil), // 49: io.defang.v1.ListDeploymentsResponse + (*TokenRequest)(nil), // 50: io.defang.v1.TokenRequest + (*TokenResponse)(nil), // 51: io.defang.v1.TokenResponse + (*Status)(nil), // 52: io.defang.v1.Status + (*Version)(nil), // 53: io.defang.v1.Version + (*TailRequest)(nil), // 54: io.defang.v1.TailRequest + (*LogEntry)(nil), // 55: io.defang.v1.LogEntry + (*TailResponse)(nil), // 56: io.defang.v1.TailResponse + (*GetServicesResponse)(nil), // 57: io.defang.v1.GetServicesResponse + (*ProjectUpdate)(nil), // 58: io.defang.v1.ProjectUpdate + (*GetRequest)(nil), // 59: io.defang.v1.GetRequest + (*Service)(nil), // 60: io.defang.v1.Service + (*Event)(nil), // 61: io.defang.v1.Event + (*PublishRequest)(nil), // 62: io.defang.v1.PublishRequest + (*SubscribeRequest)(nil), // 63: io.defang.v1.SubscribeRequest + (*SubscribeResponse)(nil), // 64: io.defang.v1.SubscribeResponse + (*GetServicesRequest)(nil), // 65: io.defang.v1.GetServicesRequest + (*DelegateSubdomainZoneRequest)(nil), // 66: io.defang.v1.DelegateSubdomainZoneRequest + (*DelegateSubdomainZoneResponse)(nil), // 67: io.defang.v1.DelegateSubdomainZoneResponse + (*DeleteSubdomainZoneRequest)(nil), // 68: io.defang.v1.DeleteSubdomainZoneRequest + (*GetDelegateSubdomainZoneRequest)(nil), // 69: io.defang.v1.GetDelegateSubdomainZoneRequest + (*SetOptionsRequest)(nil), // 70: io.defang.v1.SetOptionsRequest + (*WhoAmIResponse)(nil), // 71: io.defang.v1.WhoAmIResponse + (*EstimateRequest)(nil), // 72: io.defang.v1.EstimateRequest + (*EstimateLineItem)(nil), // 73: io.defang.v1.EstimateLineItem + (*EstimateResponse)(nil), // 74: io.defang.v1.EstimateResponse + (*PreviewRequest)(nil), // 75: io.defang.v1.PreviewRequest + (*PreviewResponse)(nil), // 76: io.defang.v1.PreviewResponse + (*GenerateComposeRequest)(nil), // 77: io.defang.v1.GenerateComposeRequest + (*GenerateComposeResponse)(nil), // 78: io.defang.v1.GenerateComposeResponse + nil, // 79: io.defang.v1.TrackRequest.PropertiesEntry + (*timestamppb.Timestamp)(nil), // 80: google.protobuf.Timestamp + (*_type.Money)(nil), // 81: google.type.Money + (*emptypb.Empty)(nil), // 82: google.protobuf.Empty } var file_io_defang_v1_fabric_proto_depIdxs = []int32{ - 0, // 0: io.defang.v1.GetSelectedProviderResponse.provider:type_name -> io.defang.v1.Provider - 0, // 1: io.defang.v1.SetSelectedProviderRequest.provider:type_name -> io.defang.v1.Provider - 32, // 2: io.defang.v1.DebugRequest.files:type_name -> io.defang.v1.File - 98, // 3: io.defang.v1.DebugRequest.since:type_name -> google.protobuf.Timestamp - 98, // 4: io.defang.v1.DebugRequest.until:type_name -> google.protobuf.Timestamp - 22, // 5: io.defang.v1.DebugResponse.issues:type_name -> io.defang.v1.Issue - 23, // 6: io.defang.v1.Issue.code_changes:type_name -> io.defang.v1.CodeChange - 95, // 7: io.defang.v1.TrackRequest.properties:type_name -> io.defang.v1.TrackRequest.PropertiesEntry - 0, // 8: io.defang.v1.CanIUseRequest.provider:type_name -> io.defang.v1.Provider - 73, // 9: io.defang.v1.DeployRequest.services:type_name -> io.defang.v1.Service - 1, // 10: io.defang.v1.DeployRequest.mode:type_name -> io.defang.v1.DeploymentMode - 0, // 11: io.defang.v1.DeployRequest.provider:type_name -> io.defang.v1.Provider - 38, // 12: io.defang.v1.DeployResponse.services:type_name -> io.defang.v1.ServiceInfo - 32, // 13: io.defang.v1.GenerateFilesResponse.files:type_name -> io.defang.v1.File - 73, // 14: io.defang.v1.ServiceInfo.service:type_name -> io.defang.v1.Service - 98, // 15: io.defang.v1.ServiceInfo.created_at:type_name -> google.protobuf.Timestamp - 98, // 16: io.defang.v1.ServiceInfo.updated_at:type_name -> google.protobuf.Timestamp - 2, // 17: io.defang.v1.ServiceInfo.state:type_name -> io.defang.v1.ServiceState - 3, // 18: io.defang.v1.ServiceInfo.type:type_name -> io.defang.v1.ResourceType - 4, // 19: io.defang.v1.Config.type:type_name -> io.defang.v1.ConfigType - 4, // 20: io.defang.v1.PutConfigRequest.type:type_name -> io.defang.v1.ConfigType - 42, // 21: io.defang.v1.GetConfigsRequest.configs:type_name -> io.defang.v1.ConfigKey - 41, // 22: io.defang.v1.GetConfigsResponse.configs:type_name -> io.defang.v1.Config - 42, // 23: io.defang.v1.DeleteConfigsRequest.configs:type_name -> io.defang.v1.ConfigKey - 42, // 24: io.defang.v1.ListConfigsResponse.configs:type_name -> io.defang.v1.ConfigKey - 98, // 25: io.defang.v1.Deployment.timestamp:type_name -> google.protobuf.Timestamp - 6, // 26: io.defang.v1.Deployment.action:type_name -> io.defang.v1.DeploymentAction - 0, // 27: io.defang.v1.Deployment.provider:type_name -> io.defang.v1.Provider - 50, // 28: io.defang.v1.PutDeploymentRequest.deployment:type_name -> io.defang.v1.Deployment - 5, // 29: io.defang.v1.ListDeploymentsRequest.type:type_name -> io.defang.v1.DeploymentType - 50, // 30: io.defang.v1.ListDeploymentsResponse.deployments:type_name -> io.defang.v1.Deployment - 98, // 31: io.defang.v1.TailRequest.since:type_name -> google.protobuf.Timestamp - 98, // 32: io.defang.v1.TailRequest.until:type_name -> google.protobuf.Timestamp - 98, // 33: io.defang.v1.LogEntry.timestamp:type_name -> google.protobuf.Timestamp - 59, // 34: io.defang.v1.TailResponse.entries:type_name -> io.defang.v1.LogEntry - 38, // 35: io.defang.v1.GetServicesResponse.services:type_name -> io.defang.v1.ServiceInfo - 98, // 36: io.defang.v1.GetServicesResponse.expires_at:type_name -> google.protobuf.Timestamp - 38, // 37: io.defang.v1.ProjectUpdate.services:type_name -> io.defang.v1.ServiceInfo - 1, // 38: io.defang.v1.ProjectUpdate.mode:type_name -> io.defang.v1.DeploymentMode - 0, // 39: io.defang.v1.ProjectUpdate.provider:type_name -> io.defang.v1.Provider - 65, // 40: io.defang.v1.Resource.devices:type_name -> io.defang.v1.Device - 66, // 41: io.defang.v1.Resources.reservations:type_name -> io.defang.v1.Resource - 67, // 42: io.defang.v1.Deploy.resources:type_name -> io.defang.v1.Resources - 8, // 43: io.defang.v1.Port.protocol:type_name -> io.defang.v1.Protocol - 9, // 44: io.defang.v1.Port.mode:type_name -> io.defang.v1.Mode - 96, // 45: io.defang.v1.Build.args:type_name -> io.defang.v1.Build.ArgsEntry - 7, // 46: io.defang.v1.Service.platform:type_name -> io.defang.v1.Platform - 68, // 47: io.defang.v1.Service.deploy:type_name -> io.defang.v1.Deploy - 69, // 48: io.defang.v1.Service.ports:type_name -> io.defang.v1.Port - 97, // 49: io.defang.v1.Service.environment:type_name -> io.defang.v1.Service.EnvironmentEntry - 71, // 50: io.defang.v1.Service.build:type_name -> io.defang.v1.Build - 70, // 51: io.defang.v1.Service.secrets:type_name -> io.defang.v1.Secret - 72, // 52: io.defang.v1.Service.healthcheck:type_name -> io.defang.v1.HealthCheck - 74, // 53: io.defang.v1.Service.static_files:type_name -> io.defang.v1.StaticFiles - 10, // 54: io.defang.v1.Service.networks:type_name -> io.defang.v1.Network - 75, // 55: io.defang.v1.Service.redis:type_name -> io.defang.v1.Redis - 1, // 56: io.defang.v1.DeployEvent.mode:type_name -> io.defang.v1.DeploymentMode - 98, // 57: io.defang.v1.DeployEvent.time:type_name -> google.protobuf.Timestamp - 98, // 58: io.defang.v1.Event.time:type_name -> google.protobuf.Timestamp - 77, // 59: io.defang.v1.PublishRequest.event:type_name -> io.defang.v1.Event - 38, // 60: io.defang.v1.SubscribeResponse.service:type_name -> io.defang.v1.ServiceInfo - 2, // 61: io.defang.v1.SubscribeResponse.state:type_name -> io.defang.v1.ServiceState - 11, // 62: io.defang.v1.WhoAmIResponse.tier:type_name -> io.defang.v1.SubscriptionTier - 0, // 63: io.defang.v1.EstimateRequest.provider:type_name -> io.defang.v1.Provider - 99, // 64: io.defang.v1.EstimateLineItem.cost:type_name -> google.type.Money - 0, // 65: io.defang.v1.EstimateResponse.provider:type_name -> io.defang.v1.Provider - 99, // 66: io.defang.v1.EstimateResponse.subtotal:type_name -> google.type.Money - 89, // 67: io.defang.v1.EstimateResponse.line_items:type_name -> io.defang.v1.EstimateLineItem - 0, // 68: io.defang.v1.PreviewRequest.provider:type_name -> io.defang.v1.Provider - 1, // 69: io.defang.v1.PreviewRequest.mode:type_name -> io.defang.v1.DeploymentMode - 12, // 70: io.defang.v1.GenerateComposeRequest.platform:type_name -> io.defang.v1.SourcePlatform - 100, // 71: io.defang.v1.FabricController.GetStatus:input_type -> google.protobuf.Empty - 100, // 72: io.defang.v1.FabricController.GetVersion:input_type -> google.protobuf.Empty - 54, // 73: io.defang.v1.FabricController.Token:input_type -> io.defang.v1.TokenRequest - 100, // 74: io.defang.v1.FabricController.RevokeToken:input_type -> google.protobuf.Empty - 58, // 75: io.defang.v1.FabricController.Tail:input_type -> io.defang.v1.TailRequest - 73, // 76: io.defang.v1.FabricController.Update:input_type -> io.defang.v1.Service - 27, // 77: io.defang.v1.FabricController.Deploy:input_type -> io.defang.v1.DeployRequest - 64, // 78: io.defang.v1.FabricController.Get:input_type -> io.defang.v1.GetRequest - 100, // 79: io.defang.v1.FabricController.GetPlaygroundProjectDomain:input_type -> google.protobuf.Empty - 29, // 80: io.defang.v1.FabricController.Delete:input_type -> io.defang.v1.DeleteRequest - 18, // 81: io.defang.v1.FabricController.Destroy:input_type -> io.defang.v1.DestroyRequest - 78, // 82: io.defang.v1.FabricController.Publish:input_type -> io.defang.v1.PublishRequest - 79, // 83: io.defang.v1.FabricController.Subscribe:input_type -> io.defang.v1.SubscribeRequest - 81, // 84: io.defang.v1.FabricController.GetServices:input_type -> io.defang.v1.GetServicesRequest - 31, // 85: io.defang.v1.FabricController.GenerateFiles:input_type -> io.defang.v1.GenerateFilesRequest - 31, // 86: io.defang.v1.FabricController.StartGenerate:input_type -> io.defang.v1.GenerateFilesRequest - 35, // 87: io.defang.v1.FabricController.GenerateStatus:input_type -> io.defang.v1.GenerateStatusRequest - 20, // 88: io.defang.v1.FabricController.Debug:input_type -> io.defang.v1.DebugRequest - 100, // 89: io.defang.v1.FabricController.SignEULA:input_type -> google.protobuf.Empty - 100, // 90: io.defang.v1.FabricController.CheckToS:input_type -> google.protobuf.Empty - 43, // 91: io.defang.v1.FabricController.PutSecret:input_type -> io.defang.v1.PutConfigRequest - 39, // 92: io.defang.v1.FabricController.DeleteSecrets:input_type -> io.defang.v1.Secrets - 48, // 93: io.defang.v1.FabricController.ListSecrets:input_type -> io.defang.v1.ListConfigsRequest - 44, // 94: io.defang.v1.FabricController.GetConfigs:input_type -> io.defang.v1.GetConfigsRequest - 43, // 95: io.defang.v1.FabricController.PutConfig:input_type -> io.defang.v1.PutConfigRequest - 47, // 96: io.defang.v1.FabricController.DeleteConfigs:input_type -> io.defang.v1.DeleteConfigsRequest - 48, // 97: io.defang.v1.FabricController.ListConfigs:input_type -> io.defang.v1.ListConfigsRequest - 51, // 98: io.defang.v1.FabricController.PutDeployment:input_type -> io.defang.v1.PutDeploymentRequest - 52, // 99: io.defang.v1.FabricController.ListDeployments:input_type -> io.defang.v1.ListDeploymentsRequest - 36, // 100: io.defang.v1.FabricController.CreateUploadURL:input_type -> io.defang.v1.UploadURLRequest - 82, // 101: io.defang.v1.FabricController.DelegateSubdomainZone:input_type -> io.defang.v1.DelegateSubdomainZoneRequest - 84, // 102: io.defang.v1.FabricController.DeleteSubdomainZone:input_type -> io.defang.v1.DeleteSubdomainZoneRequest - 85, // 103: io.defang.v1.FabricController.GetDelegateSubdomainZone:input_type -> io.defang.v1.GetDelegateSubdomainZoneRequest - 86, // 104: io.defang.v1.FabricController.SetOptions:input_type -> io.defang.v1.SetOptionsRequest - 100, // 105: io.defang.v1.FabricController.WhoAmI:input_type -> google.protobuf.Empty - 24, // 106: io.defang.v1.FabricController.Track:input_type -> io.defang.v1.TrackRequest - 100, // 107: io.defang.v1.FabricController.DeleteMe:input_type -> google.protobuf.Empty - 17, // 108: io.defang.v1.FabricController.VerifyDNSSetup:input_type -> io.defang.v1.VerifyDNSSetupRequest - 14, // 109: io.defang.v1.FabricController.GetSelectedProvider:input_type -> io.defang.v1.GetSelectedProviderRequest - 16, // 110: io.defang.v1.FabricController.SetSelectedProvider:input_type -> io.defang.v1.SetSelectedProviderRequest - 25, // 111: io.defang.v1.FabricController.CanIUse:input_type -> io.defang.v1.CanIUseRequest - 88, // 112: io.defang.v1.FabricController.Estimate:input_type -> io.defang.v1.EstimateRequest - 91, // 113: io.defang.v1.FabricController.Preview:input_type -> io.defang.v1.PreviewRequest - 93, // 114: io.defang.v1.FabricController.GenerateCompose:input_type -> io.defang.v1.GenerateComposeRequest - 56, // 115: io.defang.v1.FabricController.GetStatus:output_type -> io.defang.v1.Status - 57, // 116: io.defang.v1.FabricController.GetVersion:output_type -> io.defang.v1.Version - 55, // 117: io.defang.v1.FabricController.Token:output_type -> io.defang.v1.TokenResponse - 100, // 118: io.defang.v1.FabricController.RevokeToken:output_type -> google.protobuf.Empty - 60, // 119: io.defang.v1.FabricController.Tail:output_type -> io.defang.v1.TailResponse - 38, // 120: io.defang.v1.FabricController.Update:output_type -> io.defang.v1.ServiceInfo - 28, // 121: io.defang.v1.FabricController.Deploy:output_type -> io.defang.v1.DeployResponse - 38, // 122: io.defang.v1.FabricController.Get:output_type -> io.defang.v1.ServiceInfo - 46, // 123: io.defang.v1.FabricController.GetPlaygroundProjectDomain:output_type -> io.defang.v1.GetPlaygroundProjectDomainResponse - 30, // 124: io.defang.v1.FabricController.Delete:output_type -> io.defang.v1.DeleteResponse - 19, // 125: io.defang.v1.FabricController.Destroy:output_type -> io.defang.v1.DestroyResponse - 100, // 126: io.defang.v1.FabricController.Publish:output_type -> google.protobuf.Empty - 80, // 127: io.defang.v1.FabricController.Subscribe:output_type -> io.defang.v1.SubscribeResponse - 61, // 128: io.defang.v1.FabricController.GetServices:output_type -> io.defang.v1.GetServicesResponse - 33, // 129: io.defang.v1.FabricController.GenerateFiles:output_type -> io.defang.v1.GenerateFilesResponse - 34, // 130: io.defang.v1.FabricController.StartGenerate:output_type -> io.defang.v1.StartGenerateResponse - 33, // 131: io.defang.v1.FabricController.GenerateStatus:output_type -> io.defang.v1.GenerateFilesResponse - 21, // 132: io.defang.v1.FabricController.Debug:output_type -> io.defang.v1.DebugResponse - 100, // 133: io.defang.v1.FabricController.SignEULA:output_type -> google.protobuf.Empty - 100, // 134: io.defang.v1.FabricController.CheckToS:output_type -> google.protobuf.Empty - 100, // 135: io.defang.v1.FabricController.PutSecret:output_type -> google.protobuf.Empty - 100, // 136: io.defang.v1.FabricController.DeleteSecrets:output_type -> google.protobuf.Empty - 39, // 137: io.defang.v1.FabricController.ListSecrets:output_type -> io.defang.v1.Secrets - 45, // 138: io.defang.v1.FabricController.GetConfigs:output_type -> io.defang.v1.GetConfigsResponse - 100, // 139: io.defang.v1.FabricController.PutConfig:output_type -> google.protobuf.Empty - 100, // 140: io.defang.v1.FabricController.DeleteConfigs:output_type -> google.protobuf.Empty - 49, // 141: io.defang.v1.FabricController.ListConfigs:output_type -> io.defang.v1.ListConfigsResponse - 100, // 142: io.defang.v1.FabricController.PutDeployment:output_type -> google.protobuf.Empty - 53, // 143: io.defang.v1.FabricController.ListDeployments:output_type -> io.defang.v1.ListDeploymentsResponse - 37, // 144: io.defang.v1.FabricController.CreateUploadURL:output_type -> io.defang.v1.UploadURLResponse - 83, // 145: io.defang.v1.FabricController.DelegateSubdomainZone:output_type -> io.defang.v1.DelegateSubdomainZoneResponse - 100, // 146: io.defang.v1.FabricController.DeleteSubdomainZone:output_type -> google.protobuf.Empty - 83, // 147: io.defang.v1.FabricController.GetDelegateSubdomainZone:output_type -> io.defang.v1.DelegateSubdomainZoneResponse - 100, // 148: io.defang.v1.FabricController.SetOptions:output_type -> google.protobuf.Empty - 87, // 149: io.defang.v1.FabricController.WhoAmI:output_type -> io.defang.v1.WhoAmIResponse - 100, // 150: io.defang.v1.FabricController.Track:output_type -> google.protobuf.Empty - 100, // 151: io.defang.v1.FabricController.DeleteMe:output_type -> google.protobuf.Empty - 100, // 152: io.defang.v1.FabricController.VerifyDNSSetup:output_type -> google.protobuf.Empty - 15, // 153: io.defang.v1.FabricController.GetSelectedProvider:output_type -> io.defang.v1.GetSelectedProviderResponse - 100, // 154: io.defang.v1.FabricController.SetSelectedProvider:output_type -> google.protobuf.Empty - 26, // 155: io.defang.v1.FabricController.CanIUse:output_type -> io.defang.v1.CanIUseResponse - 90, // 156: io.defang.v1.FabricController.Estimate:output_type -> io.defang.v1.EstimateResponse - 92, // 157: io.defang.v1.FabricController.Preview:output_type -> io.defang.v1.PreviewResponse - 94, // 158: io.defang.v1.FabricController.GenerateCompose:output_type -> io.defang.v1.GenerateComposeResponse - 115, // [115:159] is the sub-list for method output_type - 71, // [71:115] is the sub-list for method input_type - 71, // [71:71] is the sub-list for extension type_name - 71, // [71:71] is the sub-list for extension extendee - 0, // [0:71] is the sub-list for field type_name + 0, // 0: io.defang.v1.GetSelectedProviderResponse.provider:type_name -> io.defang.v1.Provider + 0, // 1: io.defang.v1.SetSelectedProviderRequest.provider:type_name -> io.defang.v1.Provider + 28, // 2: io.defang.v1.DebugRequest.files:type_name -> io.defang.v1.File + 80, // 3: io.defang.v1.DebugRequest.since:type_name -> google.protobuf.Timestamp + 80, // 4: io.defang.v1.DebugRequest.until:type_name -> google.protobuf.Timestamp + 18, // 5: io.defang.v1.DebugResponse.issues:type_name -> io.defang.v1.Issue + 19, // 6: io.defang.v1.Issue.code_changes:type_name -> io.defang.v1.CodeChange + 79, // 7: io.defang.v1.TrackRequest.properties:type_name -> io.defang.v1.TrackRequest.PropertiesEntry + 0, // 8: io.defang.v1.CanIUseRequest.provider:type_name -> io.defang.v1.Provider + 1, // 9: io.defang.v1.DeployRequest.mode:type_name -> io.defang.v1.DeploymentMode + 0, // 10: io.defang.v1.DeployRequest.provider:type_name -> io.defang.v1.Provider + 34, // 11: io.defang.v1.DeployResponse.services:type_name -> io.defang.v1.ServiceInfo + 28, // 12: io.defang.v1.GenerateFilesResponse.files:type_name -> io.defang.v1.File + 60, // 13: io.defang.v1.ServiceInfo.service:type_name -> io.defang.v1.Service + 80, // 14: io.defang.v1.ServiceInfo.created_at:type_name -> google.protobuf.Timestamp + 80, // 15: io.defang.v1.ServiceInfo.updated_at:type_name -> google.protobuf.Timestamp + 2, // 16: io.defang.v1.ServiceInfo.state:type_name -> io.defang.v1.ServiceState + 3, // 17: io.defang.v1.ServiceInfo.type:type_name -> io.defang.v1.ResourceType + 4, // 18: io.defang.v1.Config.type:type_name -> io.defang.v1.ConfigType + 4, // 19: io.defang.v1.PutConfigRequest.type:type_name -> io.defang.v1.ConfigType + 38, // 20: io.defang.v1.GetConfigsRequest.configs:type_name -> io.defang.v1.ConfigKey + 37, // 21: io.defang.v1.GetConfigsResponse.configs:type_name -> io.defang.v1.Config + 38, // 22: io.defang.v1.DeleteConfigsRequest.configs:type_name -> io.defang.v1.ConfigKey + 38, // 23: io.defang.v1.ListConfigsResponse.configs:type_name -> io.defang.v1.ConfigKey + 80, // 24: io.defang.v1.Deployment.timestamp:type_name -> google.protobuf.Timestamp + 6, // 25: io.defang.v1.Deployment.action:type_name -> io.defang.v1.DeploymentAction + 0, // 26: io.defang.v1.Deployment.provider:type_name -> io.defang.v1.Provider + 46, // 27: io.defang.v1.PutDeploymentRequest.deployment:type_name -> io.defang.v1.Deployment + 5, // 28: io.defang.v1.ListDeploymentsRequest.type:type_name -> io.defang.v1.DeploymentType + 46, // 29: io.defang.v1.ListDeploymentsResponse.deployments:type_name -> io.defang.v1.Deployment + 80, // 30: io.defang.v1.TailRequest.since:type_name -> google.protobuf.Timestamp + 80, // 31: io.defang.v1.TailRequest.until:type_name -> google.protobuf.Timestamp + 80, // 32: io.defang.v1.LogEntry.timestamp:type_name -> google.protobuf.Timestamp + 55, // 33: io.defang.v1.TailResponse.entries:type_name -> io.defang.v1.LogEntry + 34, // 34: io.defang.v1.GetServicesResponse.services:type_name -> io.defang.v1.ServiceInfo + 80, // 35: io.defang.v1.GetServicesResponse.expires_at:type_name -> google.protobuf.Timestamp + 34, // 36: io.defang.v1.ProjectUpdate.services:type_name -> io.defang.v1.ServiceInfo + 1, // 37: io.defang.v1.ProjectUpdate.mode:type_name -> io.defang.v1.DeploymentMode + 0, // 38: io.defang.v1.ProjectUpdate.provider:type_name -> io.defang.v1.Provider + 80, // 39: io.defang.v1.Event.time:type_name -> google.protobuf.Timestamp + 61, // 40: io.defang.v1.PublishRequest.event:type_name -> io.defang.v1.Event + 34, // 41: io.defang.v1.SubscribeResponse.service:type_name -> io.defang.v1.ServiceInfo + 2, // 42: io.defang.v1.SubscribeResponse.state:type_name -> io.defang.v1.ServiceState + 7, // 43: io.defang.v1.WhoAmIResponse.tier:type_name -> io.defang.v1.SubscriptionTier + 0, // 44: io.defang.v1.EstimateRequest.provider:type_name -> io.defang.v1.Provider + 81, // 45: io.defang.v1.EstimateLineItem.cost:type_name -> google.type.Money + 0, // 46: io.defang.v1.EstimateResponse.provider:type_name -> io.defang.v1.Provider + 81, // 47: io.defang.v1.EstimateResponse.subtotal:type_name -> google.type.Money + 73, // 48: io.defang.v1.EstimateResponse.line_items:type_name -> io.defang.v1.EstimateLineItem + 0, // 49: io.defang.v1.PreviewRequest.provider:type_name -> io.defang.v1.Provider + 1, // 50: io.defang.v1.PreviewRequest.mode:type_name -> io.defang.v1.DeploymentMode + 8, // 51: io.defang.v1.GenerateComposeRequest.platform:type_name -> io.defang.v1.SourcePlatform + 82, // 52: io.defang.v1.FabricController.GetStatus:input_type -> google.protobuf.Empty + 82, // 53: io.defang.v1.FabricController.GetVersion:input_type -> google.protobuf.Empty + 50, // 54: io.defang.v1.FabricController.Token:input_type -> io.defang.v1.TokenRequest + 82, // 55: io.defang.v1.FabricController.RevokeToken:input_type -> google.protobuf.Empty + 54, // 56: io.defang.v1.FabricController.Tail:input_type -> io.defang.v1.TailRequest + 60, // 57: io.defang.v1.FabricController.Update:input_type -> io.defang.v1.Service + 23, // 58: io.defang.v1.FabricController.Deploy:input_type -> io.defang.v1.DeployRequest + 59, // 59: io.defang.v1.FabricController.Get:input_type -> io.defang.v1.GetRequest + 82, // 60: io.defang.v1.FabricController.GetPlaygroundProjectDomain:input_type -> google.protobuf.Empty + 25, // 61: io.defang.v1.FabricController.Delete:input_type -> io.defang.v1.DeleteRequest + 14, // 62: io.defang.v1.FabricController.Destroy:input_type -> io.defang.v1.DestroyRequest + 62, // 63: io.defang.v1.FabricController.Publish:input_type -> io.defang.v1.PublishRequest + 63, // 64: io.defang.v1.FabricController.Subscribe:input_type -> io.defang.v1.SubscribeRequest + 65, // 65: io.defang.v1.FabricController.GetServices:input_type -> io.defang.v1.GetServicesRequest + 27, // 66: io.defang.v1.FabricController.GenerateFiles:input_type -> io.defang.v1.GenerateFilesRequest + 27, // 67: io.defang.v1.FabricController.StartGenerate:input_type -> io.defang.v1.GenerateFilesRequest + 31, // 68: io.defang.v1.FabricController.GenerateStatus:input_type -> io.defang.v1.GenerateStatusRequest + 16, // 69: io.defang.v1.FabricController.Debug:input_type -> io.defang.v1.DebugRequest + 82, // 70: io.defang.v1.FabricController.SignEULA:input_type -> google.protobuf.Empty + 82, // 71: io.defang.v1.FabricController.CheckToS:input_type -> google.protobuf.Empty + 39, // 72: io.defang.v1.FabricController.PutSecret:input_type -> io.defang.v1.PutConfigRequest + 35, // 73: io.defang.v1.FabricController.DeleteSecrets:input_type -> io.defang.v1.Secrets + 44, // 74: io.defang.v1.FabricController.ListSecrets:input_type -> io.defang.v1.ListConfigsRequest + 40, // 75: io.defang.v1.FabricController.GetConfigs:input_type -> io.defang.v1.GetConfigsRequest + 39, // 76: io.defang.v1.FabricController.PutConfig:input_type -> io.defang.v1.PutConfigRequest + 43, // 77: io.defang.v1.FabricController.DeleteConfigs:input_type -> io.defang.v1.DeleteConfigsRequest + 44, // 78: io.defang.v1.FabricController.ListConfigs:input_type -> io.defang.v1.ListConfigsRequest + 47, // 79: io.defang.v1.FabricController.PutDeployment:input_type -> io.defang.v1.PutDeploymentRequest + 48, // 80: io.defang.v1.FabricController.ListDeployments:input_type -> io.defang.v1.ListDeploymentsRequest + 32, // 81: io.defang.v1.FabricController.CreateUploadURL:input_type -> io.defang.v1.UploadURLRequest + 66, // 82: io.defang.v1.FabricController.DelegateSubdomainZone:input_type -> io.defang.v1.DelegateSubdomainZoneRequest + 68, // 83: io.defang.v1.FabricController.DeleteSubdomainZone:input_type -> io.defang.v1.DeleteSubdomainZoneRequest + 69, // 84: io.defang.v1.FabricController.GetDelegateSubdomainZone:input_type -> io.defang.v1.GetDelegateSubdomainZoneRequest + 70, // 85: io.defang.v1.FabricController.SetOptions:input_type -> io.defang.v1.SetOptionsRequest + 82, // 86: io.defang.v1.FabricController.WhoAmI:input_type -> google.protobuf.Empty + 20, // 87: io.defang.v1.FabricController.Track:input_type -> io.defang.v1.TrackRequest + 82, // 88: io.defang.v1.FabricController.DeleteMe:input_type -> google.protobuf.Empty + 13, // 89: io.defang.v1.FabricController.VerifyDNSSetup:input_type -> io.defang.v1.VerifyDNSSetupRequest + 10, // 90: io.defang.v1.FabricController.GetSelectedProvider:input_type -> io.defang.v1.GetSelectedProviderRequest + 12, // 91: io.defang.v1.FabricController.SetSelectedProvider:input_type -> io.defang.v1.SetSelectedProviderRequest + 21, // 92: io.defang.v1.FabricController.CanIUse:input_type -> io.defang.v1.CanIUseRequest + 72, // 93: io.defang.v1.FabricController.Estimate:input_type -> io.defang.v1.EstimateRequest + 75, // 94: io.defang.v1.FabricController.Preview:input_type -> io.defang.v1.PreviewRequest + 77, // 95: io.defang.v1.FabricController.GenerateCompose:input_type -> io.defang.v1.GenerateComposeRequest + 52, // 96: io.defang.v1.FabricController.GetStatus:output_type -> io.defang.v1.Status + 53, // 97: io.defang.v1.FabricController.GetVersion:output_type -> io.defang.v1.Version + 51, // 98: io.defang.v1.FabricController.Token:output_type -> io.defang.v1.TokenResponse + 82, // 99: io.defang.v1.FabricController.RevokeToken:output_type -> google.protobuf.Empty + 56, // 100: io.defang.v1.FabricController.Tail:output_type -> io.defang.v1.TailResponse + 34, // 101: io.defang.v1.FabricController.Update:output_type -> io.defang.v1.ServiceInfo + 24, // 102: io.defang.v1.FabricController.Deploy:output_type -> io.defang.v1.DeployResponse + 34, // 103: io.defang.v1.FabricController.Get:output_type -> io.defang.v1.ServiceInfo + 42, // 104: io.defang.v1.FabricController.GetPlaygroundProjectDomain:output_type -> io.defang.v1.GetPlaygroundProjectDomainResponse + 26, // 105: io.defang.v1.FabricController.Delete:output_type -> io.defang.v1.DeleteResponse + 15, // 106: io.defang.v1.FabricController.Destroy:output_type -> io.defang.v1.DestroyResponse + 82, // 107: io.defang.v1.FabricController.Publish:output_type -> google.protobuf.Empty + 64, // 108: io.defang.v1.FabricController.Subscribe:output_type -> io.defang.v1.SubscribeResponse + 57, // 109: io.defang.v1.FabricController.GetServices:output_type -> io.defang.v1.GetServicesResponse + 29, // 110: io.defang.v1.FabricController.GenerateFiles:output_type -> io.defang.v1.GenerateFilesResponse + 30, // 111: io.defang.v1.FabricController.StartGenerate:output_type -> io.defang.v1.StartGenerateResponse + 29, // 112: io.defang.v1.FabricController.GenerateStatus:output_type -> io.defang.v1.GenerateFilesResponse + 17, // 113: io.defang.v1.FabricController.Debug:output_type -> io.defang.v1.DebugResponse + 82, // 114: io.defang.v1.FabricController.SignEULA:output_type -> google.protobuf.Empty + 82, // 115: io.defang.v1.FabricController.CheckToS:output_type -> google.protobuf.Empty + 82, // 116: io.defang.v1.FabricController.PutSecret:output_type -> google.protobuf.Empty + 82, // 117: io.defang.v1.FabricController.DeleteSecrets:output_type -> google.protobuf.Empty + 35, // 118: io.defang.v1.FabricController.ListSecrets:output_type -> io.defang.v1.Secrets + 41, // 119: io.defang.v1.FabricController.GetConfigs:output_type -> io.defang.v1.GetConfigsResponse + 82, // 120: io.defang.v1.FabricController.PutConfig:output_type -> google.protobuf.Empty + 82, // 121: io.defang.v1.FabricController.DeleteConfigs:output_type -> google.protobuf.Empty + 45, // 122: io.defang.v1.FabricController.ListConfigs:output_type -> io.defang.v1.ListConfigsResponse + 82, // 123: io.defang.v1.FabricController.PutDeployment:output_type -> google.protobuf.Empty + 49, // 124: io.defang.v1.FabricController.ListDeployments:output_type -> io.defang.v1.ListDeploymentsResponse + 33, // 125: io.defang.v1.FabricController.CreateUploadURL:output_type -> io.defang.v1.UploadURLResponse + 67, // 126: io.defang.v1.FabricController.DelegateSubdomainZone:output_type -> io.defang.v1.DelegateSubdomainZoneResponse + 82, // 127: io.defang.v1.FabricController.DeleteSubdomainZone:output_type -> google.protobuf.Empty + 67, // 128: io.defang.v1.FabricController.GetDelegateSubdomainZone:output_type -> io.defang.v1.DelegateSubdomainZoneResponse + 82, // 129: io.defang.v1.FabricController.SetOptions:output_type -> google.protobuf.Empty + 71, // 130: io.defang.v1.FabricController.WhoAmI:output_type -> io.defang.v1.WhoAmIResponse + 82, // 131: io.defang.v1.FabricController.Track:output_type -> google.protobuf.Empty + 82, // 132: io.defang.v1.FabricController.DeleteMe:output_type -> google.protobuf.Empty + 82, // 133: io.defang.v1.FabricController.VerifyDNSSetup:output_type -> google.protobuf.Empty + 11, // 134: io.defang.v1.FabricController.GetSelectedProvider:output_type -> io.defang.v1.GetSelectedProviderResponse + 82, // 135: io.defang.v1.FabricController.SetSelectedProvider:output_type -> google.protobuf.Empty + 22, // 136: io.defang.v1.FabricController.CanIUse:output_type -> io.defang.v1.CanIUseResponse + 74, // 137: io.defang.v1.FabricController.Estimate:output_type -> io.defang.v1.EstimateResponse + 76, // 138: io.defang.v1.FabricController.Preview:output_type -> io.defang.v1.PreviewResponse + 78, // 139: io.defang.v1.FabricController.GenerateCompose:output_type -> io.defang.v1.GenerateComposeResponse + 96, // [96:140] is the sub-list for method output_type + 52, // [52:96] is the sub-list for method input_type + 52, // [52:52] is the sub-list for extension type_name + 52, // [52:52] is the sub-list for extension extendee + 0, // [0:52] is the sub-list for field type_name } func init() { file_io_defang_v1_fabric_proto_init() } @@ -7373,8 +6115,8 @@ func file_io_defang_v1_fabric_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_io_defang_v1_fabric_proto_rawDesc, - NumEnums: 14, - NumMessages: 84, + NumEnums: 10, + NumMessages: 70, NumExtensions: 0, NumServices: 1, }, diff --git a/src/protos/io/defang/v1/fabric.proto b/src/protos/io/defang/v1/fabric.proto index 9320c7424..a2390db7c 100644 --- a/src/protos/io/defang/v1/fabric.proto +++ b/src/protos/io/defang/v1/fabric.proto @@ -247,8 +247,7 @@ message CanIUseResponse { } message DeployRequest { - repeated Service services = 1 - [ deprecated = true ]; // deprecated; use compose + reserved 1; // was: services string project = 2 [ deprecated = true ]; // deprecated; use compose.name DeploymentMode mode = 3; bytes compose = 4; // yaml (or json) @@ -340,6 +339,7 @@ message ServiceInfo { string domainname = 16; // domain name for the service string lb_dns_name = 17; // fully qualified domain name for the load-balancer bool allow_scaling = 18; // true if service is allowed to autoscale + string healthcheck = 19; // healthcheck path ResourceType type = 21; } @@ -541,169 +541,33 @@ message ProjectUpdate { // versioned using project_outputs_version } -enum Platform { - option deprecated = - true; // still used by pulumi-defang provider in state files - LINUX_AMD64 = 0; - LINUX_ARM64 = 1; - LINUX_ANY = 2; -} - -message ServiceID { - option deprecated = - true; // still used by pulumi-defang provider in state files - string name = 1; - string project = 2; -} - message GetRequest { // was ServiceID string name = 1; string project = 2; } -message Device { - option deprecated = - true; // still used by pulumi-defang provider in state files - repeated string capabilities = 1; // "gpu", "tpu", etc. - string driver = 2; // "nvidia", "amd", etc. - uint32 count = 3; // number of devices to reserve -} - -message Resource { - option deprecated = - true; // still used by pulumi-defang provider in state files - float memory = 1; // in MiB - float cpus = 2; // fractional vCPUs - repeated Device devices = 3; // devices & capabilities -} - -message Resources { - option deprecated = - true; // still used by pulumi-defang provider in state files - Resource reservations = 1; // requested resources - - // Resource limits = 2; // hard limits -} - -message Deploy { - option deprecated = - true; // still used by pulumi-defang provider in state files - uint32 replicas = 1; // number of initial replicas - Resources resources = 2; // reservations and limits - - // Placement placement = 3; - // EndpointMode endpoint_mode - // Mode mode -} - -enum Protocol { - option deprecated = - true; // still used by pulumi-defang provider in state files - ANY = 0; // unspecified means any protocol - UDP = 1; - TCP = 2; - HTTP = 3; - HTTP2 = 4; - GRPC = 5; // HTTP/2 with gRPC health checks -} - -enum Mode { - option deprecated = - true; // still used by pulumi-defang provider in state files - HOST = 0; // no load-balancer; suitable for internal services and functions - INGRESS = 1; // with load-balancer; suitable for public services -} - -message Port { - option deprecated = - true; // still used by pulumi-defang provider in state files - uint32 target = 1; - Protocol protocol = 2; - Mode mode = 3; // load-balanced (ingress) or not (host) - - // string host_ip "127.0.0.1" - // Range published "8080" -} - -message Secret { - option deprecated = - true; // still used by pulumi-defang provider in state files - string source = 1; // name of the secret - // string target = 2; -} - -message Build { - option deprecated = - true; // still used by pulumi-defang provider in state files - string context = 1; // path or URL to the build context - string dockerfile = 2; // path to the Dockerfile - map args = 3; // build-time variables - float shm_size = 4; // in MiB - string target = 5; -} - -message HealthCheck { - option deprecated = - true; // still used by pulumi-defang provider in state files - repeated string test = 1; - uint32 interval = 2; // in seconds - uint32 timeout = 3; // in seconds; must be less than interval - uint32 retries = 4; -} - -enum Network { - option deprecated = - true; // still used by pulumi-defang provider in state files - UNSPECIFIED = 0; // was: internal=false - PRIVATE = 1; // was: internal=true - PUBLIC = 2; -} - message Service { option deprecated = true; // still used by pulumi-defang provider in state files string name = 1; - string image = 2; - Platform platform = 3; - bool internal = 4 [ deprecated = true ]; // deprecated: use networks - Deploy deploy = 5; - repeated Port ports = 6; - map environment = 7; - Build build = 8; - repeated Secret secrets = 9; // FIXME: these are actually env vars - HealthCheck healthcheck = 10; - repeated string command = 11; - string domainname = 12; - bool init = 13; - string dns_role = 14; // x-defang-dns-role: role arn used to access route53 to - // create dns records - StaticFiles static_files = 15; // x-defang-static-files: use a managed CDN - Network networks = 16; // currently only 1 network is supported - repeated string aliases = 17; - Redis redis = 18; // x-defang-redis: use a managed redis - string project = 20; // defaults to tenant ID -} - -message StaticFiles { - option deprecated = - true; // still used by pulumi-defang provider in state files - string folder = 1; - repeated string redirects = 2; -} - -message Redis { option deprecated = true; } - -// TODO: internal message; move to a separate proto file; was Event -message DeployEvent { - DeploymentMode mode = 1; - string type = 2; // required - string source = 3; - string id = 4; // etag - string datacontenttype = 5; - string dataschema = 6; - string subject = 7; // tenant|stack; also used as SQS group ID - google.protobuf.Timestamp time = 8; - bytes data = 9; + reserved 2; // was: string image + reserved 3; // was: Platform platform + reserved 4; // was: bool internal + reserved 5; // was: Deploy deploy + reserved 6; // was: repeated Port ports + reserved 7; // was: map environment + reserved 8; // was: Build build + reserved 9; // was: repeated Secret secrets + reserved 10; // was: HealthCheck healthcheck + reserved 11; // was: repeated string command + reserved 12; // was: string domainname + reserved 13; // was: bool init + reserved 14; // was: string dns_role + reserved 15; // was: StaticFiles static_files + reserved 16; // was: Network networks + reserved 17; // was: repeated string aliases + reserved 18; // was: Redis redis + reserved 20; // was: string project } message Event {