diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 197729d8c8..7fbbf4f657 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -29,5 +29,5 @@ To submit code for review, follow these steps: 1. Make sure your changes are building and passing all tests locally, project following [README's guidance](./README.md#build-instructions) 2. Make sure your code is in accordance with our [Style Guide](https://github.com/kurtosis-tech/style-guide) -3. Open a PR whose title obeys the [conventional commits](https://www.conventionalcommits.org/en/v1.0.0/#summary) convention and fill out the information provided in the Pull Request template. +3. Open a PR whose title obeys the conventional commits convention and fill out the information provided in the Pull Request template. 4. After all CI checks pass, tag `@kurtosis-tech/engineers` for review diff --git a/api/golang/core/kurtosis_core_rpc_api_bindings/api_container_service.pb.go b/api/golang/core/kurtosis_core_rpc_api_bindings/api_container_service.pb.go index 7a7b44357e..7560fb4975 100644 --- a/api/golang/core/kurtosis_core_rpc_api_bindings/api_container_service.pb.go +++ b/api/golang/core/kurtosis_core_rpc_api_bindings/api_container_service.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 -// protoc v4.24.4 +// protoc-gen-go v1.32.0 +// protoc v4.25.2 // source: api_container_service.proto package kurtosis_core_rpc_api_bindings @@ -821,6 +821,8 @@ type RunStarlarkPackageArgs struct { ImageDownloadMode *ImageDownloadMode `protobuf:"varint,14,opt,name=image_download_mode,json=imageDownloadMode,proto3,enum=api_container_api.ImageDownloadMode,oneof" json:"image_download_mode,omitempty"` // Defaults to false NonBlockingMode *bool `protobuf:"varint,15,opt,name=non_blocking_mode,json=nonBlockingMode,proto3,oneof" json:"non_blocking_mode,omitempty"` + // token that will be used to authenticate requests for this package + GithubAuthToken *string `protobuf:"bytes,16,opt,name=github_auth_token,json=githubAuthToken,proto3,oneof" json:"github_auth_token,omitempty"` } func (x *RunStarlarkPackageArgs) Reset() { @@ -960,6 +962,13 @@ func (x *RunStarlarkPackageArgs) GetNonBlockingMode() bool { return false } +func (x *RunStarlarkPackageArgs) GetGithubAuthToken() string { + if x != nil && x.GithubAuthToken != nil { + return *x.GithubAuthToken + } + return "" +} + type isRunStarlarkPackageArgs_StarlarkPackageContent interface { isRunStarlarkPackageArgs_StarlarkPackageContent() } @@ -3634,7 +3643,7 @@ var file_api_container_service_proto_rawDesc = []byte{ 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x6e, 0x6f, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x69, 0x6e, 0x67, - 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x22, 0xad, 0x07, 0x0a, 0x16, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, + 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x22, 0xf4, 0x07, 0x0a, 0x16, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x41, 0x72, 0x67, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x49, 0x64, 0x12, @@ -3678,569 +3687,574 @@ var file_api_container_service_proto_rawDesc = []byte{ 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2f, 0x0a, 0x11, 0x6e, 0x6f, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x48, 0x0a, 0x52, 0x0f, 0x6e, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x69, - 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x88, 0x01, 0x01, 0x42, 0x1a, 0x0a, 0x18, 0x73, 0x74, 0x61, - 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, - 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x42, 0x0a, 0x0a, 0x08, 0x5f, - 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x70, 0x61, 0x72, 0x61, - 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x6c, 0x6f, 0x6e, - 0x65, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x72, 0x65, - 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x5f, 0x6d, - 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6d, 0x61, 0x69, - 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, - 0x14, 0x0a, 0x12, 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x5f, 0x69, 0x64, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, - 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x69, 0x6d, 0x61, 0x67, - 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x42, - 0x14, 0x0a, 0x12, 0x5f, 0x6e, 0x6f, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x69, 0x6e, 0x67, - 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x22, 0xb6, 0x04, 0x0a, 0x17, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, - 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4c, 0x69, 0x6e, - 0x65, 0x12, 0x4a, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, - 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, - 0x52, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x38, 0x0a, - 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, - 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, - 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, - 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x4d, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x67, 0x72, - 0x65, 0x73, 0x73, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, - 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, - 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x50, 0x72, - 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x48, 0x00, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, - 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x5d, 0x0a, 0x12, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, - 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x48, 0x00, 0x52, 0x11, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x5b, 0x0a, 0x12, 0x72, 0x75, 0x6e, 0x5f, 0x66, 0x69, 0x6e, - 0x69, 0x73, 0x68, 0x65, 0x64, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, - 0x6e, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, - 0x52, 0x10, 0x72, 0x75, 0x6e, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x12, 0x3e, 0x0a, 0x07, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2f, 0x0a, 0x11, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x10, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x0b, 0x52, 0x0f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x41, 0x75, + 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x1a, 0x0a, 0x18, 0x73, 0x74, + 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x61, + 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x42, 0x0a, 0x0a, 0x08, + 0x5f, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x70, 0x61, 0x72, + 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x6c, 0x6f, + 0x6e, 0x65, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x72, + 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x5f, + 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6d, 0x61, + 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, + 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x69, 0x6d, 0x61, + 0x67, 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6d, 0x6f, 0x64, 0x65, + 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x6e, 0x6f, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x69, 0x6e, + 0x67, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x67, 0x69, 0x74, 0x68, 0x75, + 0x62, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xb6, 0x04, 0x0a, + 0x17, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x4c, 0x69, 0x6e, 0x65, 0x12, 0x4a, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, + 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, + 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x38, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, - 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x07, 0x77, 0x61, 0x72, 0x6e, 0x69, - 0x6e, 0x67, 0x12, 0x35, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x66, - 0x6f, 0x48, 0x00, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x42, 0x13, 0x0a, 0x11, 0x72, 0x75, 0x6e, - 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x22, 0x31, - 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x21, - 0x0a, 0x0c, 0x69, 0x6e, 0x66, 0x6f, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x6e, 0x66, 0x6f, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x22, 0x3a, 0x0a, 0x0f, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x57, 0x61, 0x72, - 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x27, 0x0a, 0x0f, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x5f, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x77, - 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xcd, 0x02, - 0x0a, 0x13, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4a, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x4d, + 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, + 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x48, 0x00, 0x52, + 0x0c, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x5d, 0x0a, + 0x12, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x5f, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, + 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x48, 0x00, 0x52, 0x11, 0x69, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x5b, 0x0a, 0x12, + 0x72, 0x75, 0x6e, 0x5f, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x5f, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, + 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x10, 0x72, 0x75, 0x6e, 0x46, 0x69, 0x6e, 0x69, + 0x73, 0x68, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x3e, 0x0a, 0x07, 0x77, 0x61, 0x72, + 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x70, 0x69, + 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, + 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x48, 0x00, + 0x52, 0x07, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x35, 0x0a, 0x04, 0x69, 0x6e, 0x66, + 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, - 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, - 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x29, 0x0a, 0x10, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x69, 0x6e, 0x73, - 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x47, 0x0a, 0x09, - 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x29, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, - 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, - 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x72, 0x67, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x35, 0x0a, 0x16, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, - 0x69, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x09, 0x69, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x64, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x5f, 0x0a, - 0x19, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x42, 0x0a, 0x1d, 0x73, 0x65, - 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x1b, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x49, 0x6e, 0x73, - 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0xa4, - 0x01, 0x0a, 0x16, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, - 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x72, 0x67, 0x12, 0x30, 0x0a, 0x14, 0x73, 0x65, 0x72, - 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x61, 0x72, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, - 0x7a, 0x65, 0x64, 0x41, 0x72, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1e, 0x0a, 0x08, 0x61, - 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, - 0x07, 0x61, 0x72, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2b, 0x0a, 0x11, 0x69, - 0x73, 0x5f, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x69, 0x73, 0x52, 0x65, 0x70, 0x72, 0x65, 0x73, - 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x61, 0x72, 0x67, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x65, 0x0a, 0x1b, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, - 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x73, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, - 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x22, 0xac, 0x02, 0x0a, - 0x0d, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x63, - 0x0a, 0x14, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x61, + 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x48, 0x00, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, + 0x42, 0x13, 0x0a, 0x11, 0x72, 0x75, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x22, 0x31, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, + 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x6e, 0x66, 0x6f, 0x5f, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x6e, 0x66, + 0x6f, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x0a, 0x0f, 0x53, 0x74, 0x61, 0x72, + 0x6c, 0x61, 0x72, 0x6b, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x27, 0x0a, 0x0f, 0x77, + 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x22, 0xcd, 0x02, 0x0a, 0x13, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, + 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4a, 0x0a, 0x08, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, + 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, + 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x10, 0x69, 0x6e, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0f, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x47, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, + 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x72, + 0x67, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x35, 0x0a, 0x16, + 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x65, 0x78, + 0x65, 0x63, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x70, 0x65, + 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x70, + 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x5f, 0x0a, 0x19, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, + 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x12, 0x42, 0x0a, 0x1d, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, + 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1b, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, + 0x69, 0x7a, 0x65, 0x64, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0xa4, 0x01, 0x0a, 0x16, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, + 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x72, 0x67, + 0x12, 0x30, 0x0a, 0x14, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x61, + 0x72, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, + 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x41, 0x72, 0x67, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x12, 0x1e, 0x0a, 0x08, 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x61, 0x72, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x88, + 0x01, 0x01, 0x12, 0x2b, 0x0a, 0x11, 0x69, 0x73, 0x5f, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, + 0x6e, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x69, + 0x73, 0x52, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, 0x42, + 0x0b, 0x0a, 0x09, 0x5f, 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x65, 0x0a, 0x1b, + 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x66, + 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, + 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, + 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x63, 0x6f, 0x6c, + 0x75, 0x6d, 0x6e, 0x22, 0xac, 0x02, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x63, 0x0a, 0x14, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, + 0x65, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, + 0x49, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x13, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x57, 0x0a, 0x10, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, + 0x6b, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x48, 0x00, 0x52, 0x0f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x12, 0x54, 0x0a, 0x0f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, - 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, - 0x65, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x13, - 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, - 0x72, 0x6f, 0x72, 0x12, 0x57, 0x0a, 0x10, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, - 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, - 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x0f, 0x76, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x54, 0x0a, 0x0f, - 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, + 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, + 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x0e, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x22, 0x42, 0x0a, 0x1b, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, + 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x3e, 0x0a, 0x17, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, + 0x72, 0x6b, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x3d, 0x0a, 0x16, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, - 0x48, 0x00, 0x52, 0x0e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, - 0x6f, 0x72, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x42, 0x0a, 0x1b, 0x53, - 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, - 0x3e, 0x0a, 0x17, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x56, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, - 0x3d, 0x0a, 0x16, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x45, 0x78, 0x65, 0x63, 0x75, - 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x92, - 0x01, 0x0a, 0x13, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x50, 0x72, - 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, - 0x74, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x0f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x65, 0x70, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x65, 0x70, - 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x74, - 0x65, 0x70, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, - 0x74, 0x65, 0x70, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x11, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x65, 0x70, 0x4e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x22, 0x8e, 0x01, 0x0a, 0x18, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, - 0x52, 0x75, 0x6e, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x12, 0x2a, 0x0a, 0x11, 0x69, 0x73, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x73, 0x75, 0x63, 0x63, 0x65, - 0x73, 0x73, 0x66, 0x75, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x69, 0x73, 0x52, - 0x75, 0x6e, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x12, 0x30, 0x0a, 0x11, - 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, - 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x88, 0x01, 0x01, 0x42, 0x14, - 0x0a, 0x12, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x6f, 0x75, - 0x74, 0x70, 0x75, 0x74, 0x22, 0xc5, 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x73, 0x41, 0x72, 0x67, 0x73, 0x12, 0x6b, 0x0a, 0x13, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x73, 0x41, 0x72, 0x67, 0x73, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x12, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x66, 0x69, 0x65, 0x72, 0x73, 0x1a, 0x45, 0x0a, 0x17, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 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, - 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd1, 0x01, 0x0a, - 0x13, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5a, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, - 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x61, 0x70, 0x69, - 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x47, - 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, - 0x1a, 0x5e, 0x0a, 0x10, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x34, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0x72, 0x0a, 0x12, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x55, 0x75, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, - 0x0e, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x65, 0x6e, 0x65, 0x64, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x65, 0x6e, 0x65, 0x64, - 0x55, 0x75, 0x69, 0x64, 0x22, 0x83, 0x01, 0x0a, 0x32, 0x47, 0x65, 0x74, 0x45, 0x78, 0x69, 0x73, - 0x74, 0x69, 0x6e, 0x67, 0x41, 0x6e, 0x64, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, - 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, - 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4d, 0x0a, 0x0e, 0x61, - 0x6c, 0x6c, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, - 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x52, 0x0e, 0x61, 0x6c, 0x6c, 0x49, - 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x22, 0x63, 0x0a, 0x0f, 0x45, 0x78, - 0x65, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x41, 0x72, 0x67, 0x73, 0x12, 0x2d, 0x0a, - 0x12, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, - 0x69, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, - 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x41, 0x72, 0x67, 0x73, 0x22, - 0x51, 0x0a, 0x13, 0x45, 0x78, 0x65, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x78, 0x69, 0x74, 0x5f, 0x63, - 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x65, 0x78, 0x69, 0x74, 0x43, - 0x6f, 0x64, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x6f, 0x67, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x6f, 0x67, 0x4f, 0x75, 0x74, 0x70, - 0x75, 0x74, 0x22, 0xac, 0x03, 0x0a, 0x26, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x48, 0x74, - 0x74, 0x70, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x76, 0x61, - 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x41, 0x72, 0x67, 0x73, 0x12, 0x2d, 0x0a, - 0x12, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, - 0x69, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, - 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, - 0x12, 0x17, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, - 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x1a, 0x69, 0x6e, 0x69, - 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, - 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x01, 0x52, - 0x18, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x4d, 0x69, 0x6c, - 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, - 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x02, 0x52, - 0x07, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x1a, 0x72, - 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6d, 0x69, 0x6c, - 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x48, - 0x03, 0x52, 0x18, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x4d, - 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x20, - 0x0a, 0x09, 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x04, 0x52, 0x08, 0x62, 0x6f, 0x64, 0x79, 0x54, 0x65, 0x78, 0x74, 0x88, 0x01, 0x01, - 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x69, 0x6e, + 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x92, 0x01, 0x0a, 0x13, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, + 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2a, 0x0a, + 0x11, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x5f, 0x69, 0x6e, + 0x66, 0x6f, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x74, 0x53, 0x74, 0x65, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, + 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x74, 0x65, 0x70, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x53, 0x74, 0x65, 0x70, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x8e, 0x01, 0x0a, 0x18, 0x53, + 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, + 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x69, 0x73, 0x5f, 0x72, 0x75, + 0x6e, 0x5f, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0f, 0x69, 0x73, 0x52, 0x75, 0x6e, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x66, 0x75, 0x6c, 0x12, 0x30, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, + 0x64, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, + 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x4f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x88, 0x01, 0x01, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, + 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0xc5, 0x01, 0x0a, 0x0f, + 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x41, 0x72, 0x67, 0x73, 0x12, + 0x6b, 0x0a, 0x13, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x61, + 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, + 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x41, 0x72, 0x67, 0x73, + 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, + 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x12, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x1a, 0x45, 0x0a, 0x17, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, + 0x72, 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, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0xd1, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5a, 0x0a, 0x0c, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x37, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x1a, 0x5e, 0x0a, 0x10, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x34, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, + 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, + 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x72, 0x0a, 0x12, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x12, 0x21, 0x0a, + 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x55, 0x75, 0x69, 0x64, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x65, 0x6e, 0x65, + 0x64, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x68, + 0x6f, 0x72, 0x74, 0x65, 0x6e, 0x65, 0x64, 0x55, 0x75, 0x69, 0x64, 0x22, 0x83, 0x01, 0x0a, 0x32, + 0x47, 0x65, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x41, 0x6e, 0x64, 0x48, 0x69, + 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x4d, 0x0a, 0x0e, 0x61, 0x6c, 0x6c, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, + 0x69, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x70, 0x69, + 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, + 0x73, 0x52, 0x0e, 0x61, 0x6c, 0x6c, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, + 0x73, 0x22, 0x63, 0x0a, 0x0f, 0x45, 0x78, 0x65, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x41, 0x72, 0x67, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, + 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x11, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, + 0x69, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x5f, 0x61, + 0x72, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x41, 0x72, 0x67, 0x73, 0x22, 0x51, 0x0a, 0x13, 0x45, 0x78, 0x65, 0x63, 0x43, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, + 0x09, 0x65, 0x78, 0x69, 0x74, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x08, 0x65, 0x78, 0x69, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x6f, + 0x67, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x6c, 0x6f, 0x67, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0xac, 0x03, 0x0a, 0x26, 0x57, 0x61, + 0x69, 0x74, 0x46, 0x6f, 0x72, 0x48, 0x74, 0x74, 0x70, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x64, 0x70, + 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, + 0x41, 0x72, 0x67, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, + 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x11, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, + 0x69, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x17, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x88, 0x01, 0x01, + 0x12, 0x41, 0x0a, 0x1a, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x64, 0x65, 0x6c, 0x61, + 0x79, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0d, 0x48, 0x01, 0x52, 0x18, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x44, + 0x65, 0x6c, 0x61, 0x79, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, + 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0d, 0x48, 0x02, 0x52, 0x07, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x88, + 0x01, 0x01, 0x12, 0x41, 0x0a, 0x1a, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x5f, 0x64, 0x65, + 0x6c, 0x61, 0x79, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x03, 0x52, 0x18, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, + 0x73, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, + 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x20, 0x0a, 0x09, 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x74, 0x65, + 0x78, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x08, 0x62, 0x6f, 0x64, 0x79, + 0x54, 0x65, 0x78, 0x74, 0x88, 0x01, 0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x70, 0x61, 0x74, 0x68, + 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x64, 0x65, 0x6c, + 0x61, 0x79, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, + 0x0a, 0x0a, 0x08, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, + 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6d, 0x69, + 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x62, + 0x6f, 0x64, 0x79, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x22, 0xe6, 0x03, 0x0a, 0x27, 0x57, 0x61, 0x69, + 0x74, 0x46, 0x6f, 0x72, 0x48, 0x74, 0x74, 0x70, 0x50, 0x6f, 0x73, 0x74, 0x45, 0x6e, 0x64, 0x70, + 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, + 0x41, 0x72, 0x67, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, + 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x11, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, + 0x69, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x17, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x88, 0x01, 0x01, + 0x12, 0x26, 0x0a, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x62, 0x6f, 0x64, 0x79, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x42, 0x6f, 0x64, 0x79, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x1a, 0x69, 0x6e, 0x69, 0x74, + 0x69, 0x61, 0x6c, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x73, + 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x02, 0x52, 0x18, + 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x4d, 0x69, 0x6c, 0x6c, + 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x72, + 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x03, 0x52, 0x07, + 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x1a, 0x72, 0x65, + 0x74, 0x72, 0x69, 0x65, 0x73, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, + 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x04, + 0x52, 0x18, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x4d, 0x69, + 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x20, 0x0a, + 0x09, 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x05, 0x52, 0x08, 0x62, 0x6f, 0x64, 0x79, 0x54, 0x65, 0x78, 0x74, 0x88, 0x01, 0x01, 0x42, + 0x07, 0x0a, 0x05, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x74, 0x65, 0x78, - 0x74, 0x22, 0xe6, 0x03, 0x0a, 0x27, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x48, 0x74, 0x74, - 0x70, 0x50, 0x6f, 0x73, 0x74, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x76, 0x61, - 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x41, 0x72, 0x67, 0x73, 0x12, 0x2d, 0x0a, - 0x12, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, - 0x69, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, - 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, - 0x12, 0x17, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, - 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x88, 0x01, 0x01, 0x12, 0x26, 0x0a, 0x0c, 0x72, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, - 0x01, 0x52, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, 0x88, 0x01, - 0x01, 0x12, 0x41, 0x0a, 0x1a, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x64, 0x65, 0x6c, - 0x61, 0x79, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x02, 0x52, 0x18, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, - 0x44, 0x65, 0x6c, 0x61, 0x79, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, - 0x73, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x03, 0x52, 0x07, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, - 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x1a, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x5f, 0x64, - 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, - 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x04, 0x52, 0x18, 0x72, 0x65, 0x74, 0x72, 0x69, - 0x65, 0x73, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, - 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x20, 0x0a, 0x09, 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x74, - 0x65, 0x78, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x05, 0x52, 0x08, 0x62, 0x6f, 0x64, - 0x79, 0x54, 0x65, 0x78, 0x74, 0x88, 0x01, 0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x70, 0x61, 0x74, - 0x68, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x62, 0x6f, - 0x64, 0x79, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x64, - 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, - 0x73, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x42, 0x1d, 0x0a, - 0x1b, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, - 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, 0x0c, 0x0a, 0x0a, - 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x22, 0x99, 0x01, 0x0a, 0x11, 0x53, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x43, 0x68, 0x75, 0x6e, 0x6b, - 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, - 0x64, 0x61, 0x74, 0x61, 0x12, 0x2e, 0x0a, 0x13, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, - 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x11, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x43, 0x68, 0x75, 0x6e, 0x6b, - 0x48, 0x61, 0x73, 0x68, 0x12, 0x40, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x43, - 0x68, 0x75, 0x6e, 0x6b, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x27, 0x0a, 0x11, 0x44, 0x61, 0x74, 0x61, 0x43, 0x68, - 0x75, 0x6e, 0x6b, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, - 0x45, 0x0a, 0x1b, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, + 0x74, 0x22, 0x99, 0x01, 0x0a, 0x11, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x65, 0x64, 0x44, 0x61, + 0x74, 0x61, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x2e, 0x0a, 0x13, 0x70, + 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x5f, 0x68, 0x61, + 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, + 0x75, 0x73, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x12, 0x40, 0x0a, 0x08, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, + 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, + 0x69, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x27, 0x0a, + 0x11, 0x44, 0x61, 0x74, 0x61, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x45, 0x0a, 0x1b, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, + 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 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, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3b, 0x0a, + 0x19, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, + 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x41, 0x72, 0x67, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x22, 0x41, 0x0a, 0x19, 0x53, 0x74, + 0x6f, 0x72, 0x65, 0x57, 0x65, 0x62, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, + 0x61, 0x63, 0x74, 0x41, 0x72, 0x67, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x33, 0x0a, + 0x1d, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x57, 0x65, 0x62, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 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, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3b, 0x0a, 0x19, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, - 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x41, - 0x72, 0x67, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, - 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, - 0x69, 0x65, 0x72, 0x22, 0x41, 0x0a, 0x19, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x57, 0x65, 0x62, 0x46, - 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x41, 0x72, 0x67, 0x73, - 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, - 0x72, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x33, 0x0a, 0x1d, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x57, - 0x65, 0x62, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 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, 0x87, 0x01, 0x0a, 0x21, + 0x69, 0x64, 0x22, 0x87, 0x01, 0x0a, 0x21, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, + 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x41, 0x72, 0x67, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3b, 0x0a, 0x25, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, - 0x63, 0x74, 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x72, 0x67, - 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, - 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, 0x61, 0x74, - 0x68, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3b, 0x0a, 0x25, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, - 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x46, 0x72, 0x6f, 0x6d, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 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, 0x52, 0x0a, 0x18, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, - 0x61, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x12, 0x1a, - 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, - 0x6c, 0x65, 0x55, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, - 0x6c, 0x65, 0x55, 0x75, 0x69, 0x64, 0x22, 0x86, 0x01, 0x0a, 0x26, 0x4c, 0x69, 0x73, 0x74, 0x46, - 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, - 0x73, 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x5c, 0x0a, 0x14, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x5f, - 0x61, 0x6e, 0x64, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, - 0x61, 0x70, 0x69, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, - 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x52, 0x11, 0x66, 0x69, - 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x73, 0x22, - 0x81, 0x01, 0x0a, 0x23, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, - 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x5a, 0x0a, 0x13, 0x66, 0x69, 0x6c, 0x65, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, - 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, - 0x64, 0x52, 0x10, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x55, - 0x75, 0x69, 0x64, 0x22, 0x8b, 0x01, 0x0a, 0x24, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x46, - 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x63, 0x0a, 0x11, - 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x69, 0x6c, 0x65, - 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, - 0x46, 0x69, 0x6c, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x10, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x22, 0x86, 0x01, 0x0a, 0x23, 0x46, 0x69, 0x6c, 0x65, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, - 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x44, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, - 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, - 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x73, 0x69, 0x7a, - 0x65, 0x12, 0x26, 0x0a, 0x0c, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, - 0x77, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x74, 0x65, 0x78, 0x74, 0x50, - 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x88, 0x01, 0x01, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x74, 0x65, - 0x78, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x22, 0x4b, 0x0a, 0x13, 0x43, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x41, 0x72, 0x67, - 0x73, 0x12, 0x34, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x52, 0x07, - 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x22, 0x19, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0xc3, 0x03, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, - 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, - 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x49, 0x64, 0x12, 0x2b, 0x0a, 0x11, - 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, - 0x7a, 0x65, 0x64, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x65, 0x72, - 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, - 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, - 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x70, 0x61, 0x72, - 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x12, 0x3a, 0x0a, 0x1a, 0x72, 0x65, 0x6c, 0x61, - 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x5f, 0x6d, 0x61, 0x69, - 0x6e, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x72, 0x65, - 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x50, 0x61, 0x74, 0x68, 0x54, 0x6f, 0x4d, 0x61, 0x69, 0x6e, - 0x46, 0x69, 0x6c, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x10, 0x6d, 0x61, 0x69, 0x6e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x5b, 0x0a, 0x15, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, - 0x61, 0x6c, 0x5f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, - 0x0e, 0x32, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x4b, 0x75, 0x72, 0x74, 0x6f, 0x73, 0x69, 0x73, 0x46, 0x65, - 0x61, 0x74, 0x75, 0x72, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x52, 0x14, 0x65, 0x78, 0x70, 0x65, 0x72, - 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, - 0x47, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, - 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, 0x27, 0x0a, 0x08, 0x50, 0x6c, 0x61, 0x6e, - 0x59, 0x61, 0x6d, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6c, 0x61, 0x6e, 0x5f, 0x79, 0x61, 0x6d, - 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, - 0x6c, 0x22, 0xdb, 0x01, 0x0a, 0x1a, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x53, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x41, 0x72, 0x67, 0x73, - 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, 0x65, 0x72, - 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x12, 0x30, 0x0a, - 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, - 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, - 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x88, 0x01, 0x01, 0x12, - 0x31, 0x0a, 0x12, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x10, 0x6d, - 0x61, 0x69, 0x6e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x88, - 0x01, 0x01, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, - 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6d, 0x61, 0x69, - 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22, - 0xae, 0x02, 0x0a, 0x1b, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x50, 0x61, 0x63, 0x6b, - 0x61, 0x67, 0x65, 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x41, 0x72, 0x67, 0x73, 0x12, - 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x49, 0x64, 0x12, 0x30, - 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, - 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x10, 0x73, 0x65, 0x72, - 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x88, 0x01, 0x01, - 0x12, 0x3f, 0x0a, 0x1a, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x61, 0x74, - 0x68, 0x5f, 0x74, 0x6f, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x16, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, - 0x50, 0x61, 0x74, 0x68, 0x54, 0x6f, 0x4d, 0x61, 0x69, 0x6e, 0x46, 0x69, 0x6c, 0x65, 0x88, 0x01, - 0x01, 0x12, 0x31, 0x0a, 0x12, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, - 0x10, 0x6d, 0x61, 0x69, 0x6e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, - 0x65, 0x88, 0x01, 0x01, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, - 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x72, - 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x5f, - 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6d, 0x61, - 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x2a, 0x36, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x54, 0x4f, 0x50, 0x50, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0b, - 0x0a, 0x07, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x55, - 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x02, 0x2a, 0x2c, 0x0a, 0x11, 0x49, 0x6d, 0x61, 0x67, - 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0a, 0x0a, - 0x06, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x6d, 0x69, 0x73, - 0x73, 0x69, 0x6e, 0x67, 0x10, 0x01, 0x2a, 0x26, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x10, 0x00, 0x12, 0x0e, - 0x0a, 0x0a, 0x4e, 0x4f, 0x5f, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x10, 0x01, 0x2a, 0x32, - 0x0a, 0x13, 0x4b, 0x75, 0x72, 0x74, 0x6f, 0x73, 0x69, 0x73, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x46, 0x6c, 0x61, 0x67, 0x12, 0x1b, 0x0a, 0x17, 0x4e, 0x4f, 0x5f, 0x49, 0x4e, 0x53, 0x54, - 0x52, 0x55, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x5f, 0x43, 0x41, 0x43, 0x48, 0x49, 0x4e, 0x47, - 0x10, 0x00, 0x2a, 0x26, 0x0a, 0x0d, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x12, 0x09, 0x0a, 0x05, 0x4e, 0x45, 0x56, 0x45, 0x52, 0x10, 0x00, 0x12, 0x0a, - 0x0a, 0x06, 0x41, 0x4c, 0x57, 0x41, 0x59, 0x53, 0x10, 0x01, 0x32, 0xa6, 0x10, 0x0a, 0x13, 0x41, - 0x70, 0x69, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x12, 0x6d, 0x0a, 0x11, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, - 0x6b, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x12, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x75, 0x6e, 0x53, - 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x41, 0x72, 0x67, - 0x73, 0x1a, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4c, 0x69, 0x6e, 0x65, 0x22, 0x00, 0x30, - 0x01, 0x12, 0x59, 0x0a, 0x15, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x72, 0x6c, - 0x61, 0x72, 0x6b, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x24, 0x2e, 0x61, 0x70, 0x69, - 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x43, 0x68, 0x75, 0x6e, 0x6b, - 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x28, 0x01, 0x12, 0x6f, 0x0a, 0x12, - 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x50, 0x61, 0x63, 0x6b, 0x61, - 0x67, 0x65, 0x12, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, - 0x72, 0x6b, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x2a, 0x2e, - 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, - 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4c, 0x69, 0x6e, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5b, 0x0a, - 0x0b, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x22, 0x2e, 0x61, - 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, - 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x41, 0x72, 0x67, 0x73, - 0x1a, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x8d, 0x01, 0x0a, 0x2a, 0x47, - 0x65, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x41, 0x6e, 0x64, 0x48, 0x69, 0x73, - 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, - 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x1a, 0x45, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, + 0x63, 0x74, 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 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, 0x52, 0x0a, 0x18, 0x46, 0x69, 0x6c, + 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x41, 0x6e, + 0x64, 0x55, 0x75, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x55, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x55, 0x75, 0x69, 0x64, 0x22, 0x86, 0x01, + 0x0a, 0x26, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, + 0x61, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5c, 0x0a, 0x14, 0x66, 0x69, 0x6c, 0x65, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x73, + 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x41, 0x6e, 0x64, 0x55, + 0x75, 0x69, 0x64, 0x52, 0x11, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x41, 0x6e, + 0x64, 0x55, 0x75, 0x69, 0x64, 0x73, 0x22, 0x81, 0x01, 0x0a, 0x23, 0x49, 0x6e, 0x73, 0x70, 0x65, + 0x63, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x43, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x5a, + 0x0a, 0x13, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x5f, 0x61, 0x6e, 0x64, + 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x61, 0x70, + 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, + 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x4e, 0x61, 0x6d, + 0x65, 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x52, 0x10, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x22, 0x8b, 0x01, 0x0a, 0x24, 0x49, + 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, + 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x63, 0x0a, 0x11, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, + 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, + 0x70, 0x69, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x43, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x86, 0x01, 0x0a, 0x23, 0x46, 0x69, 0x6c, + 0x65, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x73, 0x46, 0x69, 0x6c, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x70, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x26, 0x0a, 0x0c, 0x74, 0x65, 0x78, 0x74, + 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, + 0x52, 0x0b, 0x74, 0x65, 0x78, 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x88, 0x01, 0x01, + 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, + 0x77, 0x22, 0x4b, 0x0a, 0x13, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x41, 0x72, 0x67, 0x73, 0x12, 0x34, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x5f, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x22, 0x19, + 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xc3, 0x03, 0x0a, 0x16, 0x47, 0x65, + 0x74, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, + 0x65, 0x49, 0x64, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, + 0x64, 0x5f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, + 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, 0x65, 0x72, + 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x20, 0x0a, + 0x0b, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x12, + 0x3a, 0x0a, 0x1a, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, + 0x5f, 0x74, 0x6f, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x16, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x50, 0x61, 0x74, + 0x68, 0x54, 0x6f, 0x4d, 0x61, 0x69, 0x6e, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x6d, + 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x6d, 0x61, 0x69, 0x6e, 0x46, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x5b, 0x0a, 0x15, 0x65, 0x78, 0x70, + 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x5f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, + 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x4b, 0x75, 0x72, + 0x74, 0x6f, 0x73, 0x69, 0x73, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x46, 0x6c, 0x61, 0x67, + 0x52, 0x14, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x46, 0x65, + 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x47, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, + 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, + 0x70, 0x69, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, + 0x52, 0x0d, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x22, + 0x27, 0x0a, 0x08, 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x70, + 0x6c, 0x61, 0x6e, 0x5f, 0x79, 0x61, 0x6d, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x70, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x22, 0xdb, 0x01, 0x0a, 0x1a, 0x53, 0x74, 0x61, + 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x50, 0x6c, 0x61, 0x6e, 0x59, + 0x61, 0x6d, 0x6c, 0x41, 0x72, 0x67, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, + 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x53, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x12, 0x30, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, + 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x00, 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x73, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x12, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x01, 0x52, 0x10, 0x6d, 0x61, 0x69, 0x6e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x73, 0x65, + 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x42, + 0x15, 0x0a, 0x13, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xae, 0x02, 0x0a, 0x1b, 0x53, 0x74, 0x61, 0x72, 0x6c, + 0x61, 0x72, 0x6b, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, + 0x6d, 0x6c, 0x41, 0x72, 0x67, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, + 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x63, 0x6b, + 0x61, 0x67, 0x65, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, + 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x00, 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x88, 0x01, 0x01, 0x12, 0x3f, 0x0a, 0x1a, 0x72, 0x65, 0x6c, 0x61, 0x74, + 0x69, 0x76, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x5f, 0x6d, 0x61, 0x69, 0x6e, + 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x16, 0x72, + 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x50, 0x61, 0x74, 0x68, 0x54, 0x6f, 0x4d, 0x61, 0x69, + 0x6e, 0x46, 0x69, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x12, 0x6d, 0x61, 0x69, 0x6e, + 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x10, 0x6d, 0x61, 0x69, 0x6e, 0x46, 0x75, 0x6e, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x14, 0x0a, 0x12, 0x5f, + 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x73, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, + 0x61, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x69, 0x6c, 0x65, + 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2a, 0x36, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x54, 0x4f, 0x50, + 0x50, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, + 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x02, 0x2a, + 0x2c, 0x0a, 0x11, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, + 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x10, 0x00, + 0x12, 0x0b, 0x0a, 0x07, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x10, 0x01, 0x2a, 0x26, 0x0a, + 0x07, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x43, 0x4f, 0x4e, 0x4e, + 0x45, 0x43, 0x54, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x4e, 0x4f, 0x5f, 0x43, 0x4f, 0x4e, 0x4e, + 0x45, 0x43, 0x54, 0x10, 0x01, 0x2a, 0x32, 0x0a, 0x13, 0x4b, 0x75, 0x72, 0x74, 0x6f, 0x73, 0x69, + 0x73, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x12, 0x1b, 0x0a, 0x17, + 0x4e, 0x4f, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x52, 0x55, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x5f, + 0x43, 0x41, 0x43, 0x48, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x2a, 0x26, 0x0a, 0x0d, 0x52, 0x65, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x09, 0x0a, 0x05, 0x4e, 0x45, + 0x56, 0x45, 0x52, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x41, 0x4c, 0x57, 0x41, 0x59, 0x53, 0x10, + 0x01, 0x32, 0xa6, 0x10, 0x0a, 0x13, 0x41, 0x70, 0x69, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x6d, 0x0a, 0x11, 0x52, 0x75, 0x6e, + 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x12, 0x28, + 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, + 0x70, 0x69, 0x2e, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x53, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, + 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x4c, 0x69, 0x6e, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x59, 0x0a, 0x15, 0x55, 0x70, 0x6c, 0x6f, + 0x61, 0x64, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, + 0x65, 0x12, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x65, 0x64, 0x44, 0x61, + 0x74, 0x61, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, + 0x00, 0x28, 0x01, 0x12, 0x6f, 0x0a, 0x12, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, + 0x72, 0x6b, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x5f, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x75, + 0x6e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, + 0x41, 0x72, 0x67, 0x73, 0x1a, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, + 0x6b, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4c, 0x69, 0x6e, 0x65, + 0x22, 0x00, 0x30, 0x01, 0x12, 0x5b, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x8d, 0x01, 0x0a, 0x2a, 0x47, 0x65, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x41, 0x6e, 0x64, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5b, 0x0a, 0x0b, 0x45, 0x78, - 0x65, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x5f, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x45, 0x78, - 0x65, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x26, 0x2e, - 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, - 0x69, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x79, 0x0a, 0x22, 0x57, 0x61, 0x69, 0x74, 0x46, - 0x6f, 0x72, 0x48, 0x74, 0x74, 0x70, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, - 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x39, 0x2e, - 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, - 0x69, 0x2e, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x48, 0x74, 0x74, 0x70, 0x47, 0x65, 0x74, + 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x45, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, + 0x45, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x41, 0x6e, 0x64, 0x48, 0x69, 0x73, 0x74, 0x6f, + 0x72, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x5b, 0x0a, 0x0b, 0x45, 0x78, 0x65, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x41, 0x72, 0x67, 0x73, 0x1a, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x43, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x79, + 0x0a, 0x22, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x48, 0x74, 0x74, 0x70, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, - 0x6c, 0x69, 0x74, 0x79, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x22, 0x00, 0x12, 0x7b, 0x0a, 0x23, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x48, 0x74, 0x74, - 0x70, 0x50, 0x6f, 0x73, 0x74, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x76, 0x61, - 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x3a, 0x2e, 0x61, 0x70, 0x69, 0x5f, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x61, - 0x69, 0x74, 0x46, 0x6f, 0x72, 0x48, 0x74, 0x74, 0x70, 0x50, 0x6f, 0x73, 0x74, 0x45, 0x6e, 0x64, - 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, - 0x79, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, - 0x6f, 0x0a, 0x13, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, - 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x12, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x2e, 0x2e, 0x61, - 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, - 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, - 0x66, 0x61, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, - 0x12, 0x6f, 0x0a, 0x15, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, - 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x5f, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x6f, - 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, - 0x61, 0x63, 0x74, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, - 0x01, 0x12, 0x79, 0x0a, 0x15, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x57, 0x65, 0x62, 0x46, 0x69, 0x6c, - 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x69, - 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, - 0x74, 0x6f, 0x72, 0x65, 0x57, 0x65, 0x62, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, - 0x66, 0x61, 0x63, 0x74, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x6f, - 0x72, 0x65, 0x57, 0x65, 0x62, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, - 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x91, 0x01, 0x0a, - 0x1d, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, - 0x61, 0x63, 0x74, 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x34, + 0x6c, 0x69, 0x74, 0x79, 0x12, 0x39, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, + 0x48, 0x74, 0x74, 0x70, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, + 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x41, 0x72, 0x67, 0x73, 0x1a, + 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x7b, 0x0a, 0x23, 0x57, 0x61, 0x69, + 0x74, 0x46, 0x6f, 0x72, 0x48, 0x74, 0x74, 0x70, 0x50, 0x6f, 0x73, 0x74, 0x45, 0x6e, 0x64, 0x70, + 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, + 0x12, 0x3a, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x48, 0x74, 0x74, 0x70, + 0x50, 0x6f, 0x73, 0x74, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x76, 0x61, 0x69, + 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6f, 0x0a, 0x13, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, + 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x12, 0x24, 0x2e, + 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, + 0x69, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x43, 0x68, + 0x75, 0x6e, 0x6b, 0x1a, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, + 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x12, 0x6f, 0x0a, 0x15, 0x44, 0x6f, 0x77, 0x6e, 0x6c, + 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, + 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, + 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, - 0x70, 0x69, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, - 0x69, 0x66, 0x61, 0x63, 0x74, 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x41, 0x72, 0x67, 0x73, 0x1a, 0x38, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, - 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x46, 0x72, 0x6f, 0x6d, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x75, 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, - 0x69, 0x66, 0x61, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, - 0x64, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x39, 0x2e, 0x61, 0x70, 0x69, - 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x4c, - 0x69, 0x73, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, - 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x91, 0x01, 0x0a, 0x1c, 0x49, 0x6e, 0x73, 0x70, + 0x70, 0x69, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x43, + 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x79, 0x0a, 0x15, 0x53, 0x74, 0x6f, 0x72, + 0x65, 0x57, 0x65, 0x62, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, + 0x74, 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x57, 0x65, 0x62, 0x46, 0x69, + 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x41, 0x72, 0x67, 0x73, 0x1a, + 0x30, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, + 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x57, 0x65, 0x62, 0x46, 0x69, 0x6c, 0x65, + 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x91, 0x01, 0x0a, 0x1d, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, + 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x34, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x46, + 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x46, 0x72, 0x6f, 0x6d, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x38, 0x2e, 0x61, 0x70, + 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, + 0x53, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, + 0x63, 0x74, 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x75, 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x46, + 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, + 0x73, 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x1a, 0x39, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, + 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x55, + 0x75, 0x69, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x91, + 0x01, 0x0a, 0x1c, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, + 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x12, + 0x36, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, + 0x61, 0x70, 0x69, 0x2e, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, + 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, - 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x36, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x6e, 0x73, - 0x70, 0x65, 0x63, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, - 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x37, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x46, 0x69, 0x6c, 0x65, - 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x67, 0x0a, 0x0f, 0x43, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x26, - 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, - 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x55, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x72, 0x6c, - 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x29, + 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x67, 0x0a, 0x0f, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x2a, 0x2e, + 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, + 0x69, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x55, 0x0a, 0x0e, 0x47, + 0x65, 0x74, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x12, 0x16, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, + 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x69, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, + 0x6b, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x12, + 0x2d, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, + 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x53, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, - 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x69, 0x0a, 0x19, 0x47, - 0x65, 0x74, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x12, 0x2d, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, - 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x50, 0x6c, 0x61, 0x6e, 0x59, - 0x61, 0x6d, 0x6c, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x50, 0x6c, 0x61, 0x6e, - 0x59, 0x61, 0x6d, 0x6c, 0x22, 0x00, 0x12, 0x6b, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, - 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x50, 0x6c, 0x61, 0x6e, - 0x59, 0x61, 0x6d, 0x6c, 0x12, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, - 0x6b, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, - 0x41, 0x72, 0x67, 0x73, 0x1a, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, - 0x6c, 0x22, 0x00, 0x42, 0x52, 0x5a, 0x50, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x6b, 0x75, 0x72, 0x74, 0x6f, 0x73, 0x69, 0x73, 0x2d, 0x74, 0x65, 0x63, 0x68, 0x2f, - 0x6b, 0x75, 0x72, 0x74, 0x6f, 0x73, 0x69, 0x73, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x6c, - 0x61, 0x6e, 0x67, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x6b, 0x75, 0x72, 0x74, 0x6f, 0x73, 0x69, - 0x73, 0x5f, 0x63, 0x6f, 0x72, 0x65, 0x5f, 0x72, 0x70, 0x63, 0x5f, 0x61, 0x70, 0x69, 0x5f, 0x62, - 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x70, 0x69, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x22, 0x00, 0x12, 0x6b, 0x0a, + 0x1a, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x50, 0x61, 0x63, 0x6b, + 0x61, 0x67, 0x65, 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x12, 0x2e, 0x2e, 0x61, 0x70, + 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, + 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x50, + 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x1b, 0x2e, 0x61, 0x70, + 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, + 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x22, 0x00, 0x42, 0x52, 0x5a, 0x50, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6b, 0x75, 0x72, 0x74, 0x6f, 0x73, 0x69, + 0x73, 0x2d, 0x74, 0x65, 0x63, 0x68, 0x2f, 0x6b, 0x75, 0x72, 0x74, 0x6f, 0x73, 0x69, 0x73, 0x2f, + 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, + 0x6b, 0x75, 0x72, 0x74, 0x6f, 0x73, 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x72, 0x65, 0x5f, 0x72, 0x70, + 0x63, 0x5f, 0x61, 0x70, 0x69, 0x5f, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/api/golang/core/kurtosis_core_rpc_api_bindings/api_container_service_grpc.pb.go b/api/golang/core/kurtosis_core_rpc_api_bindings/api_container_service_grpc.pb.go index b86b3ee8cc..b0740c5e5f 100644 --- a/api/golang/core/kurtosis_core_rpc_api_bindings/api_container_service_grpc.pb.go +++ b/api/golang/core/kurtosis_core_rpc_api_bindings/api_container_service_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.3.0 -// - protoc v4.24.4 +// - protoc v4.25.2 // source: api_container_service.proto package kurtosis_core_rpc_api_bindings diff --git a/api/golang/core/lib/binding_constructors/binding_constructors.go b/api/golang/core/lib/binding_constructors/binding_constructors.go index 770d6c9e87..d97b7ee228 100644 --- a/api/golang/core/lib/binding_constructors/binding_constructors.go +++ b/api/golang/core/lib/binding_constructors/binding_constructors.go @@ -80,6 +80,7 @@ func NewRunStarlarkPackageArgs( cloudUserId string, imageDownloadMode kurtosis_core_rpc_api_bindings.ImageDownloadMode, nonBlockingMode bool, + githubAuthToken string, ) *kurtosis_core_rpc_api_bindings.RunStarlarkPackageArgs { parallelismCopy := new(int32) *parallelismCopy = parallelism @@ -90,6 +91,8 @@ func NewRunStarlarkPackageArgs( imageDownloadModeCopy := new(kurtosis_core_rpc_api_bindings.ImageDownloadMode) *imageDownloadModeCopy = imageDownloadMode clonePackage := false + githubAuthTokenCopy := new(string) + *githubAuthTokenCopy = githubAuthToken return &kurtosis_core_rpc_api_bindings.RunStarlarkPackageArgs{ PackageId: packageId, ClonePackage: &clonePackage, @@ -104,6 +107,7 @@ func NewRunStarlarkPackageArgs( CloudUserId: cloudUserIdCopy, ImageDownloadMode: imageDownloadModeCopy, NonBlockingMode: &nonBlockingMode, + GithubAuthToken: githubAuthTokenCopy, } } @@ -119,6 +123,7 @@ func NewRunStarlarkRemotePackageArgs( cloudUserId string, imageDownloadMode kurtosis_core_rpc_api_bindings.ImageDownloadMode, nonBlockingMode bool, + githubAuthToken string, ) *kurtosis_core_rpc_api_bindings.RunStarlarkPackageArgs { parallelismCopy := new(int32) *parallelismCopy = parallelism @@ -129,6 +134,8 @@ func NewRunStarlarkRemotePackageArgs( imageDownloadModeCopy := new(kurtosis_core_rpc_api_bindings.ImageDownloadMode) *imageDownloadModeCopy = imageDownloadMode clonePackage := true + githubAuthTokenCopy := new(string) + *githubAuthTokenCopy = githubAuthToken return &kurtosis_core_rpc_api_bindings.RunStarlarkPackageArgs{ PackageId: packageId, ClonePackage: &clonePackage, @@ -143,6 +150,7 @@ func NewRunStarlarkRemotePackageArgs( CloudUserId: cloudUserIdCopy, ImageDownloadMode: imageDownloadModeCopy, NonBlockingMode: &nonBlockingMode, + GithubAuthToken: githubAuthTokenCopy, } } diff --git a/api/golang/core/lib/enclaves/enclave_context.go b/api/golang/core/lib/enclaves/enclave_context.go index f0db1b53d2..9849652114 100644 --- a/api/golang/core/lib/enclaves/enclave_context.go +++ b/api/golang/core/lib/enclaves/enclave_context.go @@ -183,7 +183,8 @@ func (enclaveCtx *EnclaveContext) RunStarlarkPackage( runConfig.CloudInstanceId, runConfig.CloudUserId, runConfig.ImageDownload, - runConfig.NonBlockingMode) + runConfig.NonBlockingMode, + runConfig.GitHubAuthToken) if err != nil { return nil, nil, stacktrace.Propagate(err, "Error preparing package '%s' for execution", packageRootPath) } @@ -308,7 +309,7 @@ func (enclaveCtx *EnclaveContext) RunStarlarkRemotePackage( }() starlarkResponseLineChan := make(chan *kurtosis_core_rpc_api_bindings.StarlarkRunResponseLine) - executeStartosisScriptArgs := binding_constructors.NewRunStarlarkRemotePackageArgs(packageId, runConfig.RelativePathToMainFile, runConfig.MainFunctionName, serializedParams, runConfig.DryRun, runConfig.Parallelism, runConfig.ExperimentalFeatureFlags, runConfig.CloudInstanceId, runConfig.CloudUserId, runConfig.ImageDownload, runConfig.NonBlockingMode) + executeStartosisScriptArgs := binding_constructors.NewRunStarlarkRemotePackageArgs(packageId, runConfig.RelativePathToMainFile, runConfig.MainFunctionName, serializedParams, runConfig.DryRun, runConfig.Parallelism, runConfig.ExperimentalFeatureFlags, runConfig.CloudInstanceId, runConfig.CloudUserId, runConfig.ImageDownload, runConfig.NonBlockingMode, runConfig.GitHubAuthToken) stream, err := enclaveCtx.client.RunStarlarkPackage(ctxWithCancel, executeStartosisScriptArgs) if err != nil { @@ -617,6 +618,7 @@ func (enclaveCtx *EnclaveContext) assembleRunStartosisPackageArg( cloudUserId string, imageDownloadMode kurtosis_core_rpc_api_bindings.ImageDownloadMode, nonBlockingMode bool, + githubAuthToken string, ) (*kurtosis_core_rpc_api_bindings.RunStarlarkPackageArgs, error) { return binding_constructors.NewRunStarlarkPackageArgs( @@ -630,7 +632,8 @@ func (enclaveCtx *EnclaveContext) assembleRunStartosisPackageArg( cloudInstanceId, cloudUserId, imageDownloadMode, - nonBlockingMode), nil + nonBlockingMode, + githubAuthToken), nil } func (enclaveCtx *EnclaveContext) uploadStarlarkPackage(packageId string, packageRootPath string) error { diff --git a/api/golang/core/lib/starlark_run_config/starlark_run_config.go b/api/golang/core/lib/starlark_run_config/starlark_run_config.go index be8303b9c6..1aea1b6f2b 100644 --- a/api/golang/core/lib/starlark_run_config/starlark_run_config.go +++ b/api/golang/core/lib/starlark_run_config/starlark_run_config.go @@ -1,6 +1,8 @@ package starlark_run_config -import "github.com/kurtosis-tech/kurtosis/api/golang/core/kurtosis_core_rpc_api_bindings" +import ( + "github.com/kurtosis-tech/kurtosis/api/golang/core/kurtosis_core_rpc_api_bindings" +) const ( defaultRelativePathToMainFile = "" @@ -12,6 +14,7 @@ const ( defaultCloudUserId = "" defaultImageDownload = kurtosis_core_rpc_api_bindings.ImageDownloadMode_missing defaultNonBlockingMode = false + defaultGitHubAuthToken = "" ) var defaultExperimentalFeatureFlags = []kurtosis_core_rpc_api_bindings.KurtosisFeatureFlag(nil) @@ -27,6 +30,7 @@ type StarlarkRunConfig struct { CloudUserId string ImageDownload kurtosis_core_rpc_api_bindings.ImageDownloadMode NonBlockingMode bool + GitHubAuthToken string } type starlarkRunConfigOption func(*StarlarkRunConfig) @@ -43,6 +47,7 @@ func NewRunStarlarkConfig(opts ...starlarkRunConfigOption) *StarlarkRunConfig { CloudUserId: defaultCloudUserId, ImageDownload: defaultImageDownload, NonBlockingMode: defaultNonBlockingMode, + GitHubAuthToken: defaultGitHubAuthToken, } for _, opt := range opts { @@ -113,3 +118,9 @@ func WithNonBlockingMode(nonBlockingMode bool) starlarkRunConfigOption { config.NonBlockingMode = nonBlockingMode } } + +func WithGitHubAuthToken(githubAuthToken string) starlarkRunConfigOption { + return func(config *StarlarkRunConfig) { + config.GitHubAuthToken = githubAuthToken + } +} diff --git a/api/golang/engine/kurtosis_engine_rpc_api_bindings/engine_service.pb.go b/api/golang/engine/kurtosis_engine_rpc_api_bindings/engine_service.pb.go index e15990f41e..7420f88c38 100644 --- a/api/golang/engine/kurtosis_engine_rpc_api_bindings/engine_service.pb.go +++ b/api/golang/engine/kurtosis_engine_rpc_api_bindings/engine_service.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 -// protoc v4.24.4 +// protoc-gen-go v1.32.0 +// protoc v4.25.2 // source: engine_service.proto package kurtosis_engine_rpc_api_bindings diff --git a/api/golang/engine/kurtosis_engine_rpc_api_bindings/engine_service_grpc.pb.go b/api/golang/engine/kurtosis_engine_rpc_api_bindings/engine_service_grpc.pb.go index 030fc811cf..d3a95bd5b6 100644 --- a/api/golang/engine/kurtosis_engine_rpc_api_bindings/engine_service_grpc.pb.go +++ b/api/golang/engine/kurtosis_engine_rpc_api_bindings/engine_service_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.3.0 -// - protoc v4.24.4 +// - protoc v4.25.2 // source: engine_service.proto package kurtosis_engine_rpc_api_bindings diff --git a/api/golang/http_rest/api_types/api_types.gen.go b/api/golang/http_rest/api_types/api_types.gen.go index cdc4bfadf9..47e2ff40b3 100644 --- a/api/golang/http_rest/api_types/api_types.gen.go +++ b/api/golang/http_rest/api_types/api_types.gen.go @@ -327,6 +327,9 @@ type RunStarlarkPackage struct { DryRun *bool `json:"dry_run,omitempty"` ExperimentalFeatures *[]KurtosisFeatureFlag `json:"experimental_features,omitempty"` + // GithubAuthToken Defaults to empty + GithubAuthToken *string `json:"github_auth_token,omitempty"` + // ImageDownloadMode 0 - ALWAYS // 1 - MISSING ImageDownloadMode *ImageDownloadMode `json:"image_download_mode,omitempty"` diff --git a/api/golang/http_rest/server/core_rest_api/api_container_server.gen.go b/api/golang/http_rest/server/core_rest_api/api_container_server.gen.go index 403877d2da..dbbe953c62 100644 --- a/api/golang/http_rest/server/core_rest_api/api_container_server.gen.go +++ b/api/golang/http_rest/server/core_rest_api/api_container_server.gen.go @@ -1546,83 +1546,83 @@ func (sh *strictHandler) PostEnclavesEnclaveIdentifierStarlarkScripts(ctx echo.C // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", - "CMTalCakb2r/p0Xq8/3/BwAA//8Jr2xbo2cAAA==", + "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", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/api/openapi/specs/kurtosis_api.yaml b/api/openapi/specs/kurtosis_api.yaml index b271a458bf..b3c46825dc 100644 --- a/api/openapi/specs/kurtosis_api.yaml +++ b/api/openapi/specs/kurtosis_api.yaml @@ -1174,6 +1174,9 @@ components: non_blocking_mode: type: boolean description: Defaults to false + github_auth_token: + type: string + description: Defaults to empty KurtosisFeatureFlag: type: string diff --git a/api/protobuf/core/api_container_service.proto b/api/protobuf/core/api_container_service.proto index 0c25653fdf..e7040bb7dd 100644 --- a/api/protobuf/core/api_container_service.proto +++ b/api/protobuf/core/api_container_service.proto @@ -235,6 +235,9 @@ message RunStarlarkPackageArgs { // Defaults to false optional bool non_blocking_mode = 15; + + // token that will be used to authenticate requests for this package + optional string github_auth_token = 16; } enum KurtosisFeatureFlag { diff --git a/api/rust/src/api_container_api.rs b/api/rust/src/api_container_api.rs index eb2fce3073..6c33e7bc54 100644 --- a/api/rust/src/api_container_api.rs +++ b/api/rust/src/api_container_api.rs @@ -236,6 +236,9 @@ pub struct RunStarlarkPackageArgs { /// Defaults to false #[prost(bool, optional, tag = "15")] pub non_blocking_mode: ::core::option::Option, + /// token that will be used to authenticate requests for this package + #[prost(string, optional, tag = "16")] + pub github_auth_token: ::core::option::Option<::prost::alloc::string::String>, /// Deprecated: If the package is local, it should have been uploaded with UploadStarlarkPackage prior to calling /// RunStarlarkPackage. If the package is remote and must be cloned within the APIC, use the standalone boolean flag /// clone_package below diff --git a/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_grpc_web_pb.d.ts b/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_grpc_web_pb.d.ts index c132a1b3d4..4b1d68af33 100644 --- a/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_grpc_web_pb.d.ts +++ b/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_grpc_web_pb.d.ts @@ -1,7 +1,7 @@ import * as grpcWeb from 'grpc-web'; -import * as api_container_service_pb from './api_container_service_pb'; // proto import: "api_container_service.proto" -import * as google_protobuf_empty_pb from 'google-protobuf/google/protobuf/empty_pb'; // proto import: "google/protobuf/empty.proto" +import * as api_container_service_pb from './api_container_service_pb'; +import * as google_protobuf_empty_pb from 'google-protobuf/google/protobuf/empty_pb'; export class ApiContainerServiceClient { diff --git a/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_grpc_web_pb.js b/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_grpc_web_pb.js index f0f15dd62f..d21fe965e4 100644 --- a/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_grpc_web_pb.js +++ b/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_grpc_web_pb.js @@ -6,7 +6,7 @@ // Code generated by protoc-gen-grpc-web. DO NOT EDIT. // versions: -// protoc-gen-grpc-web v1.5.0 +// protoc-gen-grpc-web v1.4.2 // protoc v3.19.1 // source: api_container_service.proto diff --git a/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_pb.d.ts b/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_pb.d.ts index e3f9de0369..710dcbbe13 100644 --- a/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_pb.d.ts +++ b/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_pb.d.ts @@ -1,6 +1,6 @@ import * as jspb from 'google-protobuf' -import * as google_protobuf_empty_pb from 'google-protobuf/google/protobuf/empty_pb'; // proto import: "google/protobuf/empty.proto" +import * as google_protobuf_empty_pb from 'google-protobuf/google/protobuf/empty_pb'; export class Port extends jspb.Message { @@ -336,6 +336,11 @@ export class RunStarlarkPackageArgs extends jspb.Message { hasNonBlockingMode(): boolean; clearNonBlockingMode(): RunStarlarkPackageArgs; + getGithubAuthToken(): string; + setGithubAuthToken(value: string): RunStarlarkPackageArgs; + hasGithubAuthToken(): boolean; + clearGithubAuthToken(): RunStarlarkPackageArgs; + getStarlarkPackageContentCase(): RunStarlarkPackageArgs.StarlarkPackageContentCase; serializeBinary(): Uint8Array; @@ -362,6 +367,7 @@ export namespace RunStarlarkPackageArgs { cloudUserId?: string, imageDownloadMode?: ImageDownloadMode, nonBlockingMode?: boolean, + githubAuthToken?: string, } export enum StarlarkPackageContentCase { @@ -419,6 +425,11 @@ export namespace RunStarlarkPackageArgs { _NON_BLOCKING_MODE_NOT_SET = 0, NON_BLOCKING_MODE = 15, } + + export enum GithubAuthTokenCase { + _GITHUB_AUTH_TOKEN_NOT_SET = 0, + GITHUB_AUTH_TOKEN = 16, + } } export class StarlarkRunResponseLine extends jspb.Message { diff --git a/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_pb.js b/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_pb.js index ee32d5447d..85c2b04a6e 100644 --- a/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_pb.js +++ b/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_pb.js @@ -2702,7 +2702,8 @@ proto.api_container_api.RunStarlarkPackageArgs.toObject = function(includeInstan cloudInstanceId: jspb.Message.getFieldWithDefault(msg, 12, ""), cloudUserId: jspb.Message.getFieldWithDefault(msg, 13, ""), imageDownloadMode: jspb.Message.getFieldWithDefault(msg, 14, 0), - nonBlockingMode: jspb.Message.getBooleanFieldWithDefault(msg, 15, false) + nonBlockingMode: jspb.Message.getBooleanFieldWithDefault(msg, 15, false), + githubAuthToken: jspb.Message.getFieldWithDefault(msg, 16, "") }; if (includeInstance) { @@ -2797,6 +2798,10 @@ proto.api_container_api.RunStarlarkPackageArgs.deserializeBinaryFromReader = fun var value = /** @type {boolean} */ (reader.readBool()); msg.setNonBlockingMode(value); break; + case 16: + var value = /** @type {string} */ (reader.readString()); + msg.setGithubAuthToken(value); + break; default: reader.skipField(); break; @@ -2924,6 +2929,13 @@ proto.api_container_api.RunStarlarkPackageArgs.serializeBinaryToWriter = functio f ); } + f = /** @type {string} */ (jspb.Message.getField(message, 16)); + if (f != null) { + writer.writeString( + 16, + f + ); + } }; @@ -3438,6 +3450,42 @@ proto.api_container_api.RunStarlarkPackageArgs.prototype.hasNonBlockingMode = fu }; +/** + * optional string github_auth_token = 16; + * @return {string} + */ +proto.api_container_api.RunStarlarkPackageArgs.prototype.getGithubAuthToken = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 16, "")); +}; + + +/** + * @param {string} value + * @return {!proto.api_container_api.RunStarlarkPackageArgs} returns this + */ +proto.api_container_api.RunStarlarkPackageArgs.prototype.setGithubAuthToken = function(value) { + return jspb.Message.setField(this, 16, value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.api_container_api.RunStarlarkPackageArgs} returns this + */ +proto.api_container_api.RunStarlarkPackageArgs.prototype.clearGithubAuthToken = function() { + return jspb.Message.setField(this, 16, undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.api_container_api.RunStarlarkPackageArgs.prototype.hasGithubAuthToken = function() { + return jspb.Message.getField(this, 16) != null; +}; + + /** * Oneof group definitions for this message. Each group defines the field diff --git a/api/typescript/src/core/kurtosis_core_rpc_api_bindings/connect/api_container_service_connect.d.ts b/api/typescript/src/core/kurtosis_core_rpc_api_bindings/connect/api_container_service_connect.d.ts index 097d5c0c5b..5f5713ba58 100644 --- a/api/typescript/src/core/kurtosis_core_rpc_api_bindings/connect/api_container_service_connect.d.ts +++ b/api/typescript/src/core/kurtosis_core_rpc_api_bindings/connect/api_container_service_connect.d.ts @@ -1,4 +1,4 @@ -// @generated by protoc-gen-connect-es v0.13.2 with parameter "target=js+dts" +// @generated by protoc-gen-connect-es v1.4.0 with parameter "target=js+dts" // @generated from file api_container_service.proto (package api_container_api, syntax proto3) /* eslint-disable */ // @ts-nocheck diff --git a/api/typescript/src/core/kurtosis_core_rpc_api_bindings/connect/api_container_service_connect.js b/api/typescript/src/core/kurtosis_core_rpc_api_bindings/connect/api_container_service_connect.js index f4d166c212..efba43715c 100644 --- a/api/typescript/src/core/kurtosis_core_rpc_api_bindings/connect/api_container_service_connect.js +++ b/api/typescript/src/core/kurtosis_core_rpc_api_bindings/connect/api_container_service_connect.js @@ -1,4 +1,4 @@ -// @generated by protoc-gen-connect-es v0.13.2 with parameter "target=js+dts" +// @generated by protoc-gen-connect-es v1.4.0 with parameter "target=js+dts" // @generated from file api_container_service.proto (package api_container_api, syntax proto3) /* eslint-disable */ // @ts-nocheck diff --git a/api/typescript/src/core/kurtosis_core_rpc_api_bindings/connect/api_container_service_pb.d.ts b/api/typescript/src/core/kurtosis_core_rpc_api_bindings/connect/api_container_service_pb.d.ts index c4d0135df2..60e477feb9 100644 --- a/api/typescript/src/core/kurtosis_core_rpc_api_bindings/connect/api_container_service_pb.d.ts +++ b/api/typescript/src/core/kurtosis_core_rpc_api_bindings/connect/api_container_service_pb.d.ts @@ -1,4 +1,4 @@ -// @generated by protoc-gen-es v1.5.1 with parameter "target=js+dts" +// @generated by protoc-gen-es v1.3.1 with parameter "target=js+dts" // @generated from file api_container_service.proto (package api_container_api, syntax proto3) /* eslint-disable */ // @ts-nocheck @@ -519,6 +519,13 @@ export declare class RunStarlarkPackageArgs extends Message); static readonly runtime: typeof proto3; diff --git a/api/typescript/src/core/kurtosis_core_rpc_api_bindings/connect/api_container_service_pb.js b/api/typescript/src/core/kurtosis_core_rpc_api_bindings/connect/api_container_service_pb.js index fc0d0240b4..09b57788b8 100644 --- a/api/typescript/src/core/kurtosis_core_rpc_api_bindings/connect/api_container_service_pb.js +++ b/api/typescript/src/core/kurtosis_core_rpc_api_bindings/connect/api_container_service_pb.js @@ -1,4 +1,4 @@ -// @generated by protoc-gen-es v1.5.1 with parameter "target=js+dts" +// @generated by protoc-gen-es v1.3.1 with parameter "target=js+dts" // @generated from file api_container_service.proto (package api_container_api, syntax proto3) /* eslint-disable */ // @ts-nocheck @@ -176,6 +176,7 @@ export const RunStarlarkPackageArgs = proto3.makeMessageType( { no: 13, name: "cloud_user_id", kind: "scalar", T: 9 /* ScalarType.STRING */, opt: true }, { no: 14, name: "image_download_mode", kind: "enum", T: proto3.getEnumType(ImageDownloadMode), opt: true }, { no: 15, name: "non_blocking_mode", kind: "scalar", T: 8 /* ScalarType.BOOL */, opt: true }, + { no: 16, name: "github_auth_token", kind: "scalar", T: 9 /* ScalarType.STRING */, opt: true }, ], ); diff --git a/api/typescript/src/engine/kurtosis_engine_rpc_api_bindings/connect/engine_service_connect.d.ts b/api/typescript/src/engine/kurtosis_engine_rpc_api_bindings/connect/engine_service_connect.d.ts index 04235e5f69..ce3e6243db 100644 --- a/api/typescript/src/engine/kurtosis_engine_rpc_api_bindings/connect/engine_service_connect.d.ts +++ b/api/typescript/src/engine/kurtosis_engine_rpc_api_bindings/connect/engine_service_connect.d.ts @@ -1,4 +1,4 @@ -// @generated by protoc-gen-connect-es v0.13.2 with parameter "target=js+dts" +// @generated by protoc-gen-connect-es v1.4.0 with parameter "target=js+dts" // @generated from file engine_service.proto (package engine_api, syntax proto3) /* eslint-disable */ // @ts-nocheck diff --git a/api/typescript/src/engine/kurtosis_engine_rpc_api_bindings/connect/engine_service_connect.js b/api/typescript/src/engine/kurtosis_engine_rpc_api_bindings/connect/engine_service_connect.js index 7d45190ac5..bb1dc86e15 100644 --- a/api/typescript/src/engine/kurtosis_engine_rpc_api_bindings/connect/engine_service_connect.js +++ b/api/typescript/src/engine/kurtosis_engine_rpc_api_bindings/connect/engine_service_connect.js @@ -1,4 +1,4 @@ -// @generated by protoc-gen-connect-es v0.13.2 with parameter "target=js+dts" +// @generated by protoc-gen-connect-es v1.4.0 with parameter "target=js+dts" // @generated from file engine_service.proto (package engine_api, syntax proto3) /* eslint-disable */ // @ts-nocheck diff --git a/api/typescript/src/engine/kurtosis_engine_rpc_api_bindings/connect/engine_service_pb.d.ts b/api/typescript/src/engine/kurtosis_engine_rpc_api_bindings/connect/engine_service_pb.d.ts index 269a10fde9..7eb383b09a 100644 --- a/api/typescript/src/engine/kurtosis_engine_rpc_api_bindings/connect/engine_service_pb.d.ts +++ b/api/typescript/src/engine/kurtosis_engine_rpc_api_bindings/connect/engine_service_pb.d.ts @@ -1,4 +1,4 @@ -// @generated by protoc-gen-es v1.5.1 with parameter "target=js+dts" +// @generated by protoc-gen-es v1.3.1 with parameter "target=js+dts" // @generated from file engine_service.proto (package engine_api, syntax proto3) /* eslint-disable */ // @ts-nocheck diff --git a/api/typescript/src/engine/kurtosis_engine_rpc_api_bindings/connect/engine_service_pb.js b/api/typescript/src/engine/kurtosis_engine_rpc_api_bindings/connect/engine_service_pb.js index 24c994a6f4..c245f62078 100644 --- a/api/typescript/src/engine/kurtosis_engine_rpc_api_bindings/connect/engine_service_pb.js +++ b/api/typescript/src/engine/kurtosis_engine_rpc_api_bindings/connect/engine_service_pb.js @@ -1,4 +1,4 @@ -// @generated by protoc-gen-es v1.5.1 with parameter "target=js+dts" +// @generated by protoc-gen-es v1.3.1 with parameter "target=js+dts" // @generated from file engine_service.proto (package engine_api, syntax proto3) /* eslint-disable */ // @ts-nocheck diff --git a/api/typescript/src/engine/kurtosis_engine_rpc_api_bindings/engine_service_grpc_web_pb.d.ts b/api/typescript/src/engine/kurtosis_engine_rpc_api_bindings/engine_service_grpc_web_pb.d.ts index 4a41f55da9..523a2a2d20 100644 --- a/api/typescript/src/engine/kurtosis_engine_rpc_api_bindings/engine_service_grpc_web_pb.d.ts +++ b/api/typescript/src/engine/kurtosis_engine_rpc_api_bindings/engine_service_grpc_web_pb.d.ts @@ -1,7 +1,7 @@ import * as grpcWeb from 'grpc-web'; -import * as engine_service_pb from './engine_service_pb'; // proto import: "engine_service.proto" -import * as google_protobuf_empty_pb from 'google-protobuf/google/protobuf/empty_pb'; // proto import: "google/protobuf/empty.proto" +import * as engine_service_pb from './engine_service_pb'; +import * as google_protobuf_empty_pb from 'google-protobuf/google/protobuf/empty_pb'; export class EngineServiceClient { diff --git a/api/typescript/src/engine/kurtosis_engine_rpc_api_bindings/engine_service_grpc_web_pb.js b/api/typescript/src/engine/kurtosis_engine_rpc_api_bindings/engine_service_grpc_web_pb.js index 6a8a4bad27..6a18e31707 100644 --- a/api/typescript/src/engine/kurtosis_engine_rpc_api_bindings/engine_service_grpc_web_pb.js +++ b/api/typescript/src/engine/kurtosis_engine_rpc_api_bindings/engine_service_grpc_web_pb.js @@ -6,7 +6,7 @@ // Code generated by protoc-gen-grpc-web. DO NOT EDIT. // versions: -// protoc-gen-grpc-web v1.5.0 +// protoc-gen-grpc-web v1.4.2 // protoc v3.19.1 // source: engine_service.proto diff --git a/api/typescript/src/engine/kurtosis_engine_rpc_api_bindings/engine_service_pb.d.ts b/api/typescript/src/engine/kurtosis_engine_rpc_api_bindings/engine_service_pb.d.ts index 06fc96768c..29cffdefcd 100644 --- a/api/typescript/src/engine/kurtosis_engine_rpc_api_bindings/engine_service_pb.d.ts +++ b/api/typescript/src/engine/kurtosis_engine_rpc_api_bindings/engine_service_pb.d.ts @@ -1,7 +1,7 @@ import * as jspb from 'google-protobuf' -import * as google_protobuf_empty_pb from 'google-protobuf/google/protobuf/empty_pb'; // proto import: "google/protobuf/empty.proto" -import * as google_protobuf_timestamp_pb from 'google-protobuf/google/protobuf/timestamp_pb'; // proto import: "google/protobuf/timestamp.proto" +import * as google_protobuf_empty_pb from 'google-protobuf/google/protobuf/empty_pb'; +import * as google_protobuf_timestamp_pb from 'google-protobuf/google/protobuf/timestamp_pb'; export class GetEngineInfoResponse extends jspb.Message { diff --git a/api/typescript/src/engine/rest_api_bindings/types.d.ts b/api/typescript/src/engine/rest_api_bindings/types.d.ts index 1e390f00c9..302f7d258b 100644 --- a/api/typescript/src/engine/rest_api_bindings/types.d.ts +++ b/api/typescript/src/engine/rest_api_bindings/types.d.ts @@ -3,1608 +3,1076 @@ * Do not make direct changes to the file. */ + export interface paths { - "/engine/info": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get engine info */ - get: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successful response */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["EngineInfo"]; - }; - }; - default: components["responses"]["NotOk"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/enclaves": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List enclaves */ - get: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successful response */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - [key: string]: components["schemas"]["EnclaveInfo"] | undefined; - }; - }; - }; - default: components["responses"]["NotOk"]; - }; - }; - put?: never; - /** Create enclave */ - post: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["CreateEnclave"]; - }; - }; - responses: { - /** @description Successful response */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["EnclaveInfo"]; - }; - }; - default: components["responses"]["NotOk"]; - }; - }; - /** - * Delete enclaves - * @description Delete stopped enclaves. TO delete all the enclaves use the query parameter `remove_all` - */ - delete: { - parameters: { - query?: { - /** @description If true, remove all enclaves. Otherwise only remove stopped enclaves. Default is false */ - remove_all?: components["parameters"]["remove_all"]; - }; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successful response */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["DeletionSummary"]; - }; - }; - default: components["responses"]["NotOk"]; - }; - }; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/enclaves/history": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List all enclave identifiers */ - get: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successful response */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["EnclaveIdentifiers"][]; - }; - }; - default: components["responses"]["NotOk"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/enclaves/{enclave_identifier}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get enclave detailed info */ - get: { - parameters: { - query?: never; - header?: never; - path: { - /** @description UUID, shortened UUID, or name of the enclave */ - enclave_identifier: components["parameters"]["enclave_identifier"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successful response */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["EnclaveInfo"]; - }; - }; - default: components["responses"]["NotOk"]; - }; - }; - put?: never; - post?: never; - /** Destroy enclave */ - delete: { - parameters: { - query?: never; - header?: never; - path: { - /** @description UUID, shortened UUID, or name of the enclave */ - enclave_identifier: components["parameters"]["enclave_identifier"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successful response */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - default: components["responses"]["NotOk"]; - }; - }; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/enclaves/{enclave_identifier}/status": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get enclave status */ - get: { - parameters: { - query?: never; - header?: never; - path: { - /** @description UUID, shortened UUID, or name of the enclave */ - enclave_identifier: components["parameters"]["enclave_identifier"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successful response */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["EnclaveStatus"]; - }; - }; - default: components["responses"]["NotOk"]; - }; - }; - put?: never; - /** Set enclave status */ - post: { - parameters: { - query?: never; - header?: never; - path: { - /** @description UUID, shortened UUID, or name of the enclave */ - enclave_identifier: components["parameters"]["enclave_identifier"]; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["EnclaveTargetStatus"]; - }; - }; - responses: { - /** @description Successful response */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - default: components["responses"]["NotOk"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/enclaves/{enclave_identifier}/starlark": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Get last Starlark run */ - get: { - parameters: { - query?: never; - header?: never; - path: { - /** @description UUID, shortened UUID, or name of the enclave */ - enclave_identifier: components["parameters"]["enclave_identifier"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successful request */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["StarlarkDescription"]; - }; - }; - default: components["responses"]["NotOk"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/enclaves/{enclave_identifier}/starlark/packages": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** - * Uploads a Starlark package - * @description Uploads a Starlark package. This step is required before the package can be executed with RunStarlarkPackage - */ - post: { - parameters: { - query?: never; - header?: never; - path: { - /** @description UUID, shortened UUID, or name of the enclave */ - enclave_identifier: components["parameters"]["enclave_identifier"]; - }; - cookie?: never; - }; - requestBody?: components["requestBodies"]["fileUploadBody"]; - responses: { - /** @description Success */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - default: components["responses"]["NotOk"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/enclaves/{enclave_identifier}/starlark/packages/{package_id}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** - * Executes a Starlark package on the user's behalf - * @description The endpoint will trigger the execution and deployment of a Starlark package. By default, it'll - * return an async logs resource using `starlark_execution_uuid` that can be used to retrieve the logs - * via streaming. It's also possible to block the call and wait for the execution to complete using the - * query parameter `retrieve_logs_async`. - */ - post: { - parameters: { - query?: { - /** @description If false, block http response until all logs are available. Default is true */ - retrieve_logs_async?: components["parameters"]["retrieve_logs_async"]; - }; - header?: never; - path: { - /** @description UUID, shortened UUID, or name of the enclave */ - enclave_identifier: components["parameters"]["enclave_identifier"]; - /** @description The package identifier that will be executed */ - package_id: components["parameters"]["package_id"]; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["RunStarlarkPackage"]; - }; - }; - responses: { - /** @description Successful request */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["StarlarkRunResponse"]; - }; - }; - default: components["responses"]["NotOk"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/enclaves/{enclave_identifier}/starlark/scripts": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** - * Executes a Starlark script on the user's behalf - * @description The endpoint will trigger the execution and deployment of a Starlark file. By default, it'll - * return an async logs resource using `starlark_execution_uuid` that can be used to retrieve the logs - * via streaming. It's also possible to block the call and wait for the execution to complete using the - * query parameter `retrieve_logs_async`. - */ - post: { - parameters: { - query?: { - /** @description If false, block http response until all logs are available. Default is true */ - retrieve_logs_async?: components["parameters"]["retrieve_logs_async"]; - }; - header?: never; - path: { - /** @description UUID, shortened UUID, or name of the enclave */ - enclave_identifier: components["parameters"]["enclave_identifier"]; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["RunStarlarkScript"]; - }; - }; - responses: { - /** @description Successful request */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["StarlarkRunResponse"]; - }; - }; - default: components["responses"]["NotOk"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/enclaves/{enclave_identifier}/services/{service_identifier}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Returns detailed information about a specific service */ - get: { - parameters: { - query?: never; - header?: never; - path: { - /** @description UUID, shortened UUID, or name of the enclave */ - enclave_identifier: components["parameters"]["enclave_identifier"]; - /** @description The service identifier of the container that the command should be executed in */ - service_identifier: components["parameters"]["service_identifier"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successful request */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ServiceInfo"]; - }; - }; - default: components["responses"]["NotOk"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/enclaves/{enclave_identifier}/services/history": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Returns information about all existing & historical services */ - get: { - parameters: { - query?: never; - header?: never; - path: { - /** @description UUID, shortened UUID, or name of the enclave */ - enclave_identifier: components["parameters"]["enclave_identifier"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successful request */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ServiceIdentifiers"][]; - }; - }; - default: components["responses"]["NotOk"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/enclaves/{enclave_identifier}/services": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Returns detailed information about alls services within the enclave */ - get: { - parameters: { - query?: { - /** @description Select services to get information */ - services?: string[]; - }; - header?: never; - path: { - /** @description UUID, shortened UUID, or name of the enclave */ - enclave_identifier: components["parameters"]["enclave_identifier"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successful request */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - [key: string]: components["schemas"]["ServiceInfo"] | undefined; - }; - }; - }; - default: components["responses"]["NotOk"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/enclaves/{enclave_identifier}/services/{service_identifier}/command": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** Executes the given command inside a running service's container */ - post: { - parameters: { - query?: never; - header?: never; - path: { - /** @description UUID, shortened UUID, or name of the enclave */ - enclave_identifier: components["parameters"]["enclave_identifier"]; - /** @description The service identifier of the container that the command should be executed in */ - service_identifier: components["parameters"]["service_identifier"]; - }; - cookie?: never; - }; - /** @description Exec Command */ - requestBody: { - content: { - "application/json": components["schemas"]["ExecCommand"]; - }; - }; - responses: { - /** @description Successful request */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ExecCommandResult"]; - }; - }; - default: components["responses"]["NotOk"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/enclaves/{enclave_identifier}/services/{service_identifier}/endpoints/{port_number}/availability": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Check for service availability - * @description Block until the given HTTP endpoint returns available, calling it through a HTTP request - */ - get: { - parameters: { - query?: { - /** @description The HTTP method used to check availability. Default is GET. */ - http_method?: components["parameters"]["http_method"]; - /** @description The path of the service to check. It mustn't start with the first slash. For instance `service/health` */ - path?: components["parameters"]["path"]; - /** @description The number of milliseconds to wait until executing the first HTTP call */ - initial_delay_milliseconds?: components["parameters"]["initial_delay_milliseconds"]; - /** @description Max number of HTTP call attempts that this will execute until giving up and returning an error */ - retries?: components["parameters"]["retries"]; - /** @description Number of milliseconds to wait between retries */ - retries_delay_milliseconds?: components["parameters"]["retries_delay_milliseconds"]; - /** @description If the endpoint returns this value, the service will be marked as available (e.g. Hello World). */ - expected_response?: components["parameters"]["expected_response"]; - /** @description If the http_method is set to POST, this value will be send as the body of the availability request. */ - request_body?: components["parameters"]["request_body"]; - }; - header?: never; - path: { - /** @description UUID, shortened UUID, or name of the enclave */ - enclave_identifier: components["parameters"]["enclave_identifier"]; - /** @description The service identifier of the container that the command should be executed in */ - service_identifier: components["parameters"]["service_identifier"]; - /** @description The port number to check availability */ - port_number: components["parameters"]["port_number"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Success */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - default: components["responses"]["NotOk"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/enclaves/{enclave_identifier}/artifacts": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** List all files artifacts */ - get: { - parameters: { - query?: never; - header?: never; - path: { - /** @description UUID, shortened UUID, or name of the enclave */ - enclave_identifier: components["parameters"]["enclave_identifier"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successful request */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["FileArtifactReference"][]; - }; - }; - default: components["responses"]["NotOk"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/enclaves/{enclave_identifier}/artifacts/{artifact_identifier}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Inspect the content of a file artifact */ - get: { - parameters: { - query?: never; - header?: never; - path: { - /** @description UUID, shortened UUID, or name of the enclave */ - enclave_identifier: components["parameters"]["enclave_identifier"]; - /** @description The artifact name or uuid */ - artifact_identifier: components["parameters"]["artifact_identifier"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successful request */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["FileArtifactDescription"][]; - }; - }; - default: components["responses"]["NotOk"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/enclaves/{enclave_identifier}/artifacts/{artifact_identifier}/download": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** Downloads a files artifact from the Kurtosis File System */ - get: { - parameters: { - query?: never; - header?: never; - path: { - /** @description UUID, shortened UUID, or name of the enclave */ - enclave_identifier: components["parameters"]["enclave_identifier"]; - /** @description The artifact name or uuid */ - artifact_identifier: components["parameters"]["artifact_identifier"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successful request */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/octet-stream": string; - }; - }; - default: components["responses"]["NotOk"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/enclaves/{enclave_identifier}/artifacts/local-file": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** Uploads local file artifact to the Kurtosis File System */ - post: { - parameters: { - query?: never; - header?: never; - path: { - /** @description UUID, shortened UUID, or name of the enclave */ - enclave_identifier: components["parameters"]["enclave_identifier"]; - }; - cookie?: never; - }; - requestBody?: components["requestBodies"]["fileUploadBody"]; - responses: { - /** @description Successful request */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": { - [key: string]: components["schemas"]["FileArtifactUploadResult"] | undefined; - }; - }; - }; - default: components["responses"]["NotOk"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/enclaves/{enclave_identifier}/artifacts/remote-file": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** - * Add remote file to Kurtosis File System - * @description Tells the API container to download a files artifact from the web to the Kurtosis File System - */ - post: { - parameters: { - query?: never; - header?: never; - path: { - /** @description UUID, shortened UUID, or name of the enclave */ - enclave_identifier: components["parameters"]["enclave_identifier"]; - }; - cookie?: never; - }; - /** @description Store Web Files Artifact */ - requestBody: { - content: { - "application/json": components["schemas"]["StoreWebFilesArtifact"]; - }; - }; - responses: { - /** @description Successful request */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["FileArtifactReference"]; - }; - }; - default: components["responses"]["NotOk"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/enclaves/{enclave_identifier}/artifacts/services/{service_identifier}": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** - * Add service's file to Kurtosis File System - * @description Tells the API container to copy a files artifact from a service to the Kurtosis File System - */ - post: { - parameters: { - query?: never; - header?: never; - path: { - /** @description UUID, shortened UUID, or name of the enclave */ - enclave_identifier: components["parameters"]["enclave_identifier"]; - /** @description The service identifier of the container that the command should be executed in */ - service_identifier: components["parameters"]["service_identifier"]; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["StoreFilesArtifactFromService"]; - }; - }; - responses: { - /** @description Successful request */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["FileArtifactReference"]; - }; - }; - default: components["responses"]["NotOk"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/enclaves/{enclave_identifier}/services/connection": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get?: never; - put?: never; - /** User services port forwarding */ - post: { - parameters: { - query?: never; - header?: never; - path: { - /** @description UUID, shortened UUID, or name of the enclave */ - enclave_identifier: components["parameters"]["enclave_identifier"]; - }; - cookie?: never; - }; - requestBody: { - content: { - "application/json": components["schemas"]["Connect"]; - }; - }; - responses: { - /** @description Successful request */ - 200: { - headers: { - [name: string]: unknown; - }; - content?: never; - }; - default: components["responses"]["NotOk"]; - }; - }; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/enclaves/{enclave_identifier}/logs": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Get enclave's services logs - * @description Get multiple enclave services logs concurrently. This endpoint can stream the logs by either starting - * a Websocket connection (recommended) or legacy HTTP streaming. - */ - get: { - parameters: { - query: { - service_uuid_set: components["parameters"]["service_uuid_set"]; - follow_logs?: components["parameters"]["follow_logs"]; - conjunctive_filters?: components["parameters"]["conjunctive_filters"]; - return_all_logs?: components["parameters"]["return_all_logs"]; - num_log_lines?: components["parameters"]["num_log_lines"]; - }; - header?: never; - path: { - /** @description UUID, shortened UUID, or name of the enclave */ - enclave_identifier: components["parameters"]["enclave_identifier"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successful response */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ServiceLogs"]; - }; - }; - default: components["responses"]["NotOk"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/enclaves/{enclave_identifier}/services/{service_identifier}/logs": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Get service logs - * @description Get service logs. This endpoint can stream the logs by either starting - * a Websocket connection (recommended) or legacy HTTP streaming. - */ - get: { - parameters: { - query?: { - follow_logs?: components["parameters"]["follow_logs"]; - conjunctive_filters?: components["parameters"]["conjunctive_filters"]; - return_all_logs?: components["parameters"]["return_all_logs"]; - num_log_lines?: components["parameters"]["num_log_lines"]; - }; - header?: never; - path: { - /** @description UUID, shortened UUID, or name of the enclave */ - enclave_identifier: components["parameters"]["enclave_identifier"]; - /** @description The service identifier of the container that the command should be executed in */ - service_identifier: components["parameters"]["service_identifier"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successful response */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ServiceLogs"]; - }; - }; - default: components["responses"]["NotOk"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/starlark/executions/{starlark_execution_uuid}/logs": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - /** - * Get Starlark execution logs - * @description Stream the logs of an Starlark execution that were initiated using `retrieve_logs_async`. - * The async logs can be consumed only once and expire after consumption or 2 hours after creation. - * This endpoint can stream the logs by either starting a Websocket connection (recommended) or - * legacy HTTP streaming. - */ - get: { - parameters: { - query?: never; - header?: never; - path: { - /** @description The unique identifier to track the execution of a Starlark script or package */ - starlark_execution_uuid: components["parameters"]["starlark_execution_uuid"]; - }; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description Successful request */ - 200: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["StarlarkRunResponseLine"][]; - }; - }; - default: components["responses"]["NotOk"]; - }; - }; - put?: never; - post?: never; - delete?: never; - options?: never; - head?: never; - patch?: never; - trace?: never; + "/engine/info": { + /** Get engine info */ + get: { + responses: { + /** @description Successful response */ + 200: { + content: { + "application/json": components["schemas"]["EngineInfo"]; + }; + }; + default: components["responses"]["NotOk"]; + }; + }; + }; + "/enclaves": { + /** List enclaves */ + get: { + responses: { + /** @description Successful response */ + 200: { + content: { + "application/json": { + [key: string]: components["schemas"]["EnclaveInfo"]; + }; + }; + }; + default: components["responses"]["NotOk"]; + }; + }; + /** Create enclave */ + post: { + requestBody: { + content: { + "application/json": components["schemas"]["CreateEnclave"]; + }; + }; + responses: { + /** @description Successful response */ + 200: { + content: { + "application/json": components["schemas"]["EnclaveInfo"]; + }; + }; + default: components["responses"]["NotOk"]; + }; + }; + /** + * Delete enclaves + * @description Delete stopped enclaves. TO delete all the enclaves use the query parameter `remove_all` + */ + delete: { + parameters: { + query?: { + remove_all?: components["parameters"]["remove_all"]; + }; + }; + responses: { + /** @description Successful response */ + 200: { + content: { + "application/json": components["schemas"]["DeletionSummary"]; + }; + }; + default: components["responses"]["NotOk"]; + }; + }; + }; + "/enclaves/history": { + /** List all enclave identifiers */ + get: { + responses: { + /** @description Successful response */ + 200: { + content: { + "application/json": components["schemas"]["EnclaveIdentifiers"][]; + }; + }; + default: components["responses"]["NotOk"]; + }; + }; + }; + "/enclaves/{enclave_identifier}": { + /** Get enclave detailed info */ + get: { + parameters: { + path: { + enclave_identifier: components["parameters"]["enclave_identifier"]; + }; + }; + responses: { + /** @description Successful response */ + 200: { + content: { + "application/json": components["schemas"]["EnclaveInfo"]; + }; + }; + default: components["responses"]["NotOk"]; + }; + }; + /** Destroy enclave */ + delete: { + parameters: { + path: { + enclave_identifier: components["parameters"]["enclave_identifier"]; + }; + }; + responses: { + /** @description Successful response */ + 200: { + content: never; + }; + default: components["responses"]["NotOk"]; + }; + }; + }; + "/enclaves/{enclave_identifier}/status": { + /** Get enclave status */ + get: { + parameters: { + path: { + enclave_identifier: components["parameters"]["enclave_identifier"]; + }; + }; + responses: { + /** @description Successful response */ + 200: { + content: { + "application/json": components["schemas"]["EnclaveStatus"]; + }; + }; + default: components["responses"]["NotOk"]; + }; + }; + /** Set enclave status */ + post: { + parameters: { + path: { + enclave_identifier: components["parameters"]["enclave_identifier"]; + }; + }; + requestBody: { + content: { + "application/json": components["schemas"]["EnclaveTargetStatus"]; + }; + }; + responses: { + /** @description Successful response */ + 200: { + content: never; + }; + default: components["responses"]["NotOk"]; + }; }; + }; + "/enclaves/{enclave_identifier}/starlark": { + /** Get last Starlark run */ + get: { + parameters: { + path: { + enclave_identifier: components["parameters"]["enclave_identifier"]; + }; + }; + responses: { + /** @description Successful request */ + 200: { + content: { + "application/json": components["schemas"]["StarlarkDescription"]; + }; + }; + default: components["responses"]["NotOk"]; + }; + }; + }; + "/enclaves/{enclave_identifier}/starlark/packages": { + /** + * Uploads a Starlark package + * @description Uploads a Starlark package. This step is required before the package can be executed with RunStarlarkPackage + */ + post: { + parameters: { + path: { + enclave_identifier: components["parameters"]["enclave_identifier"]; + }; + }; + requestBody: components["requestBodies"]["fileUploadBody"]; + responses: { + /** @description Success */ + 200: { + content: never; + }; + default: components["responses"]["NotOk"]; + }; + }; + }; + "/enclaves/{enclave_identifier}/starlark/packages/{package_id}": { + /** + * Executes a Starlark package on the user's behalf + * @description The endpoint will trigger the execution and deployment of a Starlark package. By default, it'll + * return an async logs resource using `starlark_execution_uuid` that can be used to retrieve the logs + * via streaming. It's also possible to block the call and wait for the execution to complete using the + * query parameter `retrieve_logs_async`. + */ + post: { + parameters: { + query?: { + retrieve_logs_async?: components["parameters"]["retrieve_logs_async"]; + }; + path: { + enclave_identifier: components["parameters"]["enclave_identifier"]; + package_id: components["parameters"]["package_id"]; + }; + }; + requestBody: { + content: { + "application/json": components["schemas"]["RunStarlarkPackage"]; + }; + }; + responses: { + /** @description Successful request */ + 200: { + content: { + "application/json": components["schemas"]["StarlarkRunResponse"]; + }; + }; + default: components["responses"]["NotOk"]; + }; + }; + }; + "/enclaves/{enclave_identifier}/starlark/scripts": { + /** + * Executes a Starlark script on the user's behalf + * @description The endpoint will trigger the execution and deployment of a Starlark file. By default, it'll + * return an async logs resource using `starlark_execution_uuid` that can be used to retrieve the logs + * via streaming. It's also possible to block the call and wait for the execution to complete using the + * query parameter `retrieve_logs_async`. + */ + post: { + parameters: { + query?: { + retrieve_logs_async?: components["parameters"]["retrieve_logs_async"]; + }; + path: { + enclave_identifier: components["parameters"]["enclave_identifier"]; + }; + }; + requestBody: { + content: { + "application/json": components["schemas"]["RunStarlarkScript"]; + }; + }; + responses: { + /** @description Successful request */ + 200: { + content: { + "application/json": components["schemas"]["StarlarkRunResponse"]; + }; + }; + default: components["responses"]["NotOk"]; + }; + }; + }; + "/enclaves/{enclave_identifier}/services/{service_identifier}": { + /** Returns detailed information about a specific service */ + get: { + parameters: { + path: { + enclave_identifier: components["parameters"]["enclave_identifier"]; + service_identifier: components["parameters"]["service_identifier"]; + }; + }; + responses: { + /** @description Successful request */ + 200: { + content: { + "application/json": components["schemas"]["ServiceInfo"]; + }; + }; + default: components["responses"]["NotOk"]; + }; + }; + }; + "/enclaves/{enclave_identifier}/services/history": { + /** Returns information about all existing & historical services */ + get: { + parameters: { + path: { + enclave_identifier: components["parameters"]["enclave_identifier"]; + }; + }; + responses: { + /** @description Successful request */ + 200: { + content: { + "application/json": components["schemas"]["ServiceIdentifiers"][]; + }; + }; + default: components["responses"]["NotOk"]; + }; + }; + }; + "/enclaves/{enclave_identifier}/services": { + /** Returns detailed information about alls services within the enclave */ + get: { + parameters: { + query?: { + /** @description Select services to get information */ + services?: string[]; + }; + path: { + enclave_identifier: components["parameters"]["enclave_identifier"]; + }; + }; + responses: { + /** @description Successful request */ + 200: { + content: { + "application/json": { + [key: string]: components["schemas"]["ServiceInfo"]; + }; + }; + }; + default: components["responses"]["NotOk"]; + }; + }; + }; + "/enclaves/{enclave_identifier}/services/{service_identifier}/command": { + /** Executes the given command inside a running service's container */ + post: { + parameters: { + path: { + enclave_identifier: components["parameters"]["enclave_identifier"]; + service_identifier: components["parameters"]["service_identifier"]; + }; + }; + /** @description Exec Command */ + requestBody: { + content: { + "application/json": components["schemas"]["ExecCommand"]; + }; + }; + responses: { + /** @description Successful request */ + 200: { + content: { + "application/json": components["schemas"]["ExecCommandResult"]; + }; + }; + default: components["responses"]["NotOk"]; + }; + }; + }; + "/enclaves/{enclave_identifier}/services/{service_identifier}/endpoints/{port_number}/availability": { + /** + * Check for service availability + * @description Block until the given HTTP endpoint returns available, calling it through a HTTP request + */ + get: { + parameters: { + query?: { + http_method?: components["parameters"]["http_method"]; + path?: components["parameters"]["path"]; + initial_delay_milliseconds?: components["parameters"]["initial_delay_milliseconds"]; + retries?: components["parameters"]["retries"]; + retries_delay_milliseconds?: components["parameters"]["retries_delay_milliseconds"]; + expected_response?: components["parameters"]["expected_response"]; + request_body?: components["parameters"]["request_body"]; + }; + path: { + enclave_identifier: components["parameters"]["enclave_identifier"]; + service_identifier: components["parameters"]["service_identifier"]; + port_number: components["parameters"]["port_number"]; + }; + }; + responses: { + /** @description Success */ + 200: { + content: never; + }; + default: components["responses"]["NotOk"]; + }; + }; + }; + "/enclaves/{enclave_identifier}/artifacts": { + /** List all files artifacts */ + get: { + parameters: { + path: { + enclave_identifier: components["parameters"]["enclave_identifier"]; + }; + }; + responses: { + /** @description Successful request */ + 200: { + content: { + "application/json": components["schemas"]["FileArtifactReference"][]; + }; + }; + default: components["responses"]["NotOk"]; + }; + }; + }; + "/enclaves/{enclave_identifier}/artifacts/{artifact_identifier}": { + /** Inspect the content of a file artifact */ + get: { + parameters: { + path: { + enclave_identifier: components["parameters"]["enclave_identifier"]; + artifact_identifier: components["parameters"]["artifact_identifier"]; + }; + }; + responses: { + /** @description Successful request */ + 200: { + content: { + "application/json": components["schemas"]["FileArtifactDescription"][]; + }; + }; + default: components["responses"]["NotOk"]; + }; + }; + }; + "/enclaves/{enclave_identifier}/artifacts/{artifact_identifier}/download": { + /** Downloads a files artifact from the Kurtosis File System */ + get: { + parameters: { + path: { + enclave_identifier: components["parameters"]["enclave_identifier"]; + artifact_identifier: components["parameters"]["artifact_identifier"]; + }; + }; + responses: { + /** @description Successful request */ + 200: { + content: { + "application/octet-stream": string; + }; + }; + default: components["responses"]["NotOk"]; + }; + }; + }; + "/enclaves/{enclave_identifier}/artifacts/local-file": { + /** Uploads local file artifact to the Kurtosis File System */ + post: { + parameters: { + path: { + enclave_identifier: components["parameters"]["enclave_identifier"]; + }; + }; + requestBody: components["requestBodies"]["fileUploadBody"]; + responses: { + /** @description Successful request */ + 200: { + content: { + "application/json": { + [key: string]: components["schemas"]["FileArtifactUploadResult"]; + }; + }; + }; + default: components["responses"]["NotOk"]; + }; + }; + }; + "/enclaves/{enclave_identifier}/artifacts/remote-file": { + /** + * Add remote file to Kurtosis File System + * @description Tells the API container to download a files artifact from the web to the Kurtosis File System + */ + post: { + parameters: { + path: { + enclave_identifier: components["parameters"]["enclave_identifier"]; + }; + }; + /** @description Store Web Files Artifact */ + requestBody: { + content: { + "application/json": components["schemas"]["StoreWebFilesArtifact"]; + }; + }; + responses: { + /** @description Successful request */ + 200: { + content: { + "application/json": components["schemas"]["FileArtifactReference"]; + }; + }; + default: components["responses"]["NotOk"]; + }; + }; + }; + "/enclaves/{enclave_identifier}/artifacts/services/{service_identifier}": { + /** + * Add service's file to Kurtosis File System + * @description Tells the API container to copy a files artifact from a service to the Kurtosis File System + */ + post: { + parameters: { + path: { + enclave_identifier: components["parameters"]["enclave_identifier"]; + service_identifier: components["parameters"]["service_identifier"]; + }; + }; + requestBody: { + content: { + "application/json": components["schemas"]["StoreFilesArtifactFromService"]; + }; + }; + responses: { + /** @description Successful request */ + 200: { + content: { + "application/json": components["schemas"]["FileArtifactReference"]; + }; + }; + default: components["responses"]["NotOk"]; + }; + }; + }; + "/enclaves/{enclave_identifier}/services/connection": { + /** User services port forwarding */ + post: { + parameters: { + path: { + enclave_identifier: components["parameters"]["enclave_identifier"]; + }; + }; + requestBody: { + content: { + "application/json": components["schemas"]["Connect"]; + }; + }; + responses: { + /** @description Successful request */ + 200: { + content: never; + }; + default: components["responses"]["NotOk"]; + }; + }; + }; + "/enclaves/{enclave_identifier}/logs": { + /** + * Get enclave's services logs + * @description Get multiple enclave services logs concurrently. This endpoint can stream the logs by either starting + * a Websocket connection (recommended) or legacy HTTP streaming. + */ + get: { + parameters: { + query: { + service_uuid_set: components["parameters"]["service_uuid_set"]; + follow_logs?: components["parameters"]["follow_logs"]; + conjunctive_filters?: components["parameters"]["conjunctive_filters"]; + return_all_logs?: components["parameters"]["return_all_logs"]; + num_log_lines?: components["parameters"]["num_log_lines"]; + }; + path: { + enclave_identifier: components["parameters"]["enclave_identifier"]; + }; + }; + responses: { + /** @description Successful response */ + 200: { + content: { + "application/json": components["schemas"]["ServiceLogs"]; + }; + }; + default: components["responses"]["NotOk"]; + }; + }; + }; + "/enclaves/{enclave_identifier}/services/{service_identifier}/logs": { + /** + * Get service logs + * @description Get service logs. This endpoint can stream the logs by either starting + * a Websocket connection (recommended) or legacy HTTP streaming. + */ + get: { + parameters: { + query?: { + follow_logs?: components["parameters"]["follow_logs"]; + conjunctive_filters?: components["parameters"]["conjunctive_filters"]; + return_all_logs?: components["parameters"]["return_all_logs"]; + num_log_lines?: components["parameters"]["num_log_lines"]; + }; + path: { + enclave_identifier: components["parameters"]["enclave_identifier"]; + service_identifier: components["parameters"]["service_identifier"]; + }; + }; + responses: { + /** @description Successful response */ + 200: { + content: { + "application/json": components["schemas"]["ServiceLogs"]; + }; + }; + default: components["responses"]["NotOk"]; + }; + }; + }; + "/starlark/executions/{starlark_execution_uuid}/logs": { + /** + * Get Starlark execution logs + * @description Stream the logs of an Starlark execution that were initiated using `retrieve_logs_async`. + * The async logs can be consumed only once and expire after consumption or 2 hours after creation. + * This endpoint can stream the logs by either starting a Websocket connection (recommended) or + * legacy HTTP streaming. + */ + get: { + parameters: { + path: { + starlark_execution_uuid: components["parameters"]["starlark_execution_uuid"]; + }; + }; + responses: { + /** @description Successful request */ + 200: { + content: { + "application/json": components["schemas"]["StarlarkRunResponseLine"][]; + }; + }; + default: components["responses"]["NotOk"]; + }; + }; + }; } + export type webhooks = Record; + export interface components { - schemas: { - /** @enum {string} */ - ResponseType: "ERROR" | "INFO" | "WARNING"; - ResponseInfo: { - type: components["schemas"]["ResponseType"]; - message: string; - /** Format: uint32 */ - code: number; - }; - EngineInfo: { - engine_version: string; - }; - CreateEnclave: { - enclave_name: string; - api_container_version_tag: string; - /** @description Enclave log level, defaults to INFO */ - api_container_log_level?: string; - /** @description Enclave mode, defaults to TEST */ - mode?: components["schemas"]["EnclaveMode"]; - /** @description Whether the APIC's container should run with the debug server to receive a remote debug connection */ - should_apic_run_in_debug_mode?: components["schemas"]["ApiContainerDebugMode"]; - }; - /** @enum {string} */ - EnclaveMode: "TEST" | "PRODUCTION"; - /** @enum {string} */ - EnclaveStatus: "RUNNING" | "STOPPED" | "EMPTY"; - /** @enum {string} */ - EnclaveTargetStatus: "STOP"; - /** @enum {string} */ - ApiContainerStatus: "RUNNING" | "STOPPED" | "NON_EXISTENT"; - /** - * @default false - * @enum {boolean} - */ - ApiContainerDebugMode: false | true; - EnclaveInfo: { - enclave_uuid: string; - name: string; - shortened_uuid: string; - containers_status: components["schemas"]["EnclaveStatus"]; - api_container_status: components["schemas"]["ApiContainerStatus"]; - api_container_info?: components["schemas"]["EnclaveAPIContainerInfo"]; - api_container_host_machine_info?: components["schemas"]["EnclaveAPIContainerHostMachineInfo"]; - creation_time: components["schemas"]["Timestamp"]; - mode: components["schemas"]["EnclaveMode"]; - }; - EnclaveAPIContainerInfo: { - container_id: string; - ip_inside_enclave: string; - grpc_port_inside_enclave: number; - bridge_ip_address: string; - }; - EnclaveAPIContainerHostMachineInfo: { - ip_on_host_machine: string; - grpc_port_on_host_machine: number; - }; - EnclaveIdentifiers: { - enclave_uuid: string; - name: string; - shortened_uuid: string; - }; - EnclaveNameAndUuid: { - name: string; - uuid: string; - }; - DeletionSummary: { - removed_enclave_name_and_uuids?: components["schemas"]["EnclaveNameAndUuid"][]; - }; - /** Format: date-time */ - Timestamp: string; - /** @description Shared Objects (Used By Multiple Endpoints) */ - Port: { - /** Format: int32 */ - number: number; - transport_protocol: components["schemas"]["TransportProtocol"]; - application_protocol?: string; - /** @description The wait timeout duration in string */ - wait_timeout?: string; - }; - /** @enum {string} */ - HttpMethodAvailability: "GET" | "POST"; - Container: { - status: components["schemas"]["ContainerStatus"]; - image_name: string; - entrypoint_args: string[]; - cmd_args: string[]; - env_vars: { - [key: string]: string | undefined; - }; - }; - /** - * @description 0 - STOPPED - * 1 - RUNNING - * 2 - UNKNOWN - * @enum {string} - */ - ServiceStatus: "STOPPED" | "RUNNING" | "UNKNOWN"; - /** - * @description 0 - ALWAYS - * 1 - MISSING - * @enum {string} - */ - ImageDownloadMode: "ALWAYS" | "MISSING"; - ServiceInfo: { - /** @description UUID of the service */ - service_uuid: string; - /** @description The IP address of the service inside the enclave */ - private_ip_addr: string; - private_ports: { - [key: string]: components["schemas"]["Port"] | undefined; - }; - /** @description Public IP address *outside* the enclave where the service is reachable - * NOTE: Will be empty if the service isn't running, the service didn't define any ports, or the backend doesn't support reporting public service info */ - public_ip_addr?: string; - public_ports?: { - [key: string]: components["schemas"]["Port"] | undefined; - }; - /** @description Name of the service */ - name: string; - /** @description Shortened uuid of the service */ - shortened_uuid: string; - service_status: components["schemas"]["ServiceStatus"]; - container: components["schemas"]["Container"]; - }; - /** - * @description 0 - CONNECT // Best effort port forwarding - * 1 - NO_CONNECT // Port forwarding disabled - * @enum {string} - */ - Connect: "CONNECT" | "NO_CONNECT"; - RunStarlarkScript: { - serialized_script: string; - /** @description Parameters data for the Starlark package main function */ - params?: { - [key: string]: unknown; - }; - /** @description Defaults to false */ - dry_run?: boolean; - /** - * Format: int32 - * @description Defaults to 4 - */ - parallelism?: number; - /** @description The name of the main function, the default value is "run" */ - main_function_name?: string; - experimental_features?: components["schemas"]["KurtosisFeatureFlag"][]; - /** @description Defaults to empty */ - cloud_instance_id?: string; - /** @description Defaults to empty */ - cloud_user_id?: string; - image_download_mode?: components["schemas"]["ImageDownloadMode"]; - /** @description Defaults to false */ - non_blocking_mode?: boolean; - }; - RunStarlarkPackage: { - /** @description Parameters data for the Starlark package main function */ - params?: { - [key: string]: unknown; - }; - /** @description Defaults to false */ - dry_run?: boolean; - /** - * Format: int32 - * @description Defaults to 4 - */ - parallelism?: number; - /** @description Whether the package should be cloned or not. - * If false, then the package will be pulled from the APIC local package store. If it's a local package then is must - * have been uploaded using UploadStarlarkPackage prior to calling RunStarlarkPackage. - * If true, then the package will be cloned from GitHub before execution starts */ - clone_package?: boolean; - /** @description The relative main file filepath, the default value is the "main.star" file in the root of a package */ - relative_path_to_main_file?: string; - /** @description The name of the main function, the default value is "run" */ - main_function_name?: string; - experimental_features?: components["schemas"]["KurtosisFeatureFlag"][]; - /** @description Defaults to empty */ - cloud_instance_id?: string; - /** @description Defaults to empty */ - cloud_user_id?: string; - image_download_mode?: components["schemas"]["ImageDownloadMode"]; - /** @description Defaults to false */ - non_blocking_mode?: boolean; - }; - /** - * @description 0 - NO_INSTRUCTIONS_CACHING - * @enum {string} - */ - KurtosisFeatureFlag: "NO_INSTRUCTIONS_CACHING"; - /** @description Starlark Execution Logs */ - StarlarkRunLogs: components["schemas"]["StarlarkRunResponseLine"][]; - /** @description Starlark Execution Response */ - StarlarkRunResponseLine: components["schemas"]["StarlarkInstruction"] | components["schemas"]["StarlarkError"] | components["schemas"]["StarlarkRunProgress"] | components["schemas"]["StarlarkInstructionResult"] | components["schemas"]["StarlarkRunFinishedEvent"] | components["schemas"]["StarlarkWarning"] | components["schemas"]["StarlarkInfo"]; - StarlarkInfo: { - info: { - instruction: { - info_message: string; - }; - }; - }; - StarlarkWarning: { - warning: { - warning_message: string; - }; - }; - StarlarkInstruction: { - position?: components["schemas"]["StarlarkInstructionPosition"]; - instruction_name: string; - arguments: components["schemas"]["StarlarkInstructionArgument"][]; - executable_instruction: string; - is_skipped: boolean; - }; - StarlarkInstructionResult: { - instruction_result: { - serialized_instruction_result: string; - }; - }; - StarlarkInstructionArgument: { - serialized_arg_value: string; - arg_name?: string; - is_representative: boolean; - }; - StarlarkInstructionPosition: { - filename: string; - /** Format: int32 */ - line: number; - /** Format: int32 */ - column: number; - }; - StarlarkError: { - error: components["schemas"]["StarlarkInterpretationError"] | components["schemas"]["StarlarkValidationError"] | components["schemas"]["StarlarkExecutionError"]; - }; - StarlarkInterpretationError: { - interpretation_error: { - error_message: string; - }; - }; - StarlarkValidationError: { - validation_error: { - error_message: string; - }; - }; - StarlarkExecutionError: { - execution_error: { - error_message: string; - }; - }; - StarlarkRunProgress: { - progress_info: { - current_step_info: string[]; - /** Format: int32 */ - total_steps: number; - /** Format: int32 */ - current_step_number: number; - }; - }; - StarlarkRunFinishedEvent: { - run_finished_event: { - is_run_successful: boolean; - serialized_output?: string; - }; - }; - /** @description Use it to asynchronously retrieve the execution logs via Websockets or http streaming */ - AsyncStarlarkExecutionLogs: { - /** @description Execution UUID to asynchronously retrieve the execution logs */ - async_starlark_execution_logs: { - starlark_execution_uuid: string; - }; - }; - StarlarkRunResponse: { - starlark_execution_logs?: components["schemas"]["AsyncStarlarkExecutionLogs"] | components["schemas"]["StarlarkRunLogs"]; - }; - /** @description An service identifier is a collection of uuid, name and shortened uuid */ - ServiceIdentifiers: { - /** @description UUID of the service */ - service_uuid: string; - /** @description Name of the service */ - name: string; - /** @description The shortened uuid of the service */ - shortened_uuid: string; - }; - /** @description Exec Command */ - ExecCommand: { - command_args: string[]; - }; - ExecCommandResult: { - /** Format: int32 */ - exit_code: number; - /** @description Assumes UTF-8 encoding */ - log_output: string; - }; - FileArtifactUploadResult: { - file_artifact_upload_result?: components["schemas"]["FileArtifactReference"] | components["schemas"]["ResponseInfo"]; - }; - /** @description Files Artifact identifier */ - FileArtifactReference: { - /** @description UUID of the files artifact, for use when referencing it in the future */ - uuid: string; - /** @description UUID of the files artifact, for use when referencing it in the future */ - name: string; - }; - /** @description Store Web Files Artifact */ - StoreWebFilesArtifact: { - /** @description URL to download the artifact from */ - url: string; - /** @description The name of the files artifact */ - name: string; - }; - StoreFilesArtifactFromService: { - /** @description The absolute source path where the source files will be copied from */ - source_path: string; - /** @description The name of the files artifact */ - name: string; - }; - FileArtifactDescription: { - /** @description Path relative to the file artifact */ - path: string; - /** - * Format: int64 - * @description Size of the file, in bytes - */ - size: number; - /** @description A bit of text content, if the file allows (similar to UNIX's 'head') */ - text_preview?: string; - }; - /** - * @description 0 - NEVER - * 1 - ALWAYS - * @enum {string} - */ - RestartPolicy: "NEVER" | "ALWAYS"; - StarlarkDescription: { - package_id: string; - serialized_script: string; - serialized_params: string; - /** Format: int32 */ - parallelism: number; - relative_path_to_main_file: string; - main_function_name: string; - experimental_features: components["schemas"]["KurtosisFeatureFlag"][]; - restart_policy: components["schemas"]["RestartPolicy"]; - }; - /** - * @description 0 - TCP - * 1 - SCTP - * 2 - UDP - * @enum {string} - */ - TransportProtocol: "TCP" | "SCTP" | "UDP"; - /** - * @description 0 - STOPPED - * 1 - RUNNING - * 2 - UNKNOWN - * @enum {string} - */ - ContainerStatus: "STOPPED" | "RUNNING" | "UNKNOWN"; - ServiceLogs: { - service_logs_by_service_uuid?: { - [key: string]: components["schemas"]["LogLine"] | undefined; - }; - not_found_service_uuid_set?: string[]; - }; - LogLine: { - line: string[]; - timestamp: components["schemas"]["Timestamp"]; - }; - LogLineFilter: { - operator: components["schemas"]["LogLineOperator"]; - text_pattern: string; - }; - /** @enum {string} */ - LogLineOperator: "DOES_CONTAIN_TEXT" | "DOES_NOT_CONTAIN_TEXT" | "DOES_CONTAIN_MATCH_REGEX" | "DOES_NOT_CONTAIN_MATCH_REGEX"; + schemas: { + /** @enum {string} */ + ResponseType: "ERROR" | "INFO" | "WARNING"; + ResponseInfo: { + type: components["schemas"]["ResponseType"]; + message: string; + /** Format: uint32 */ + code: number; }; - responses: { - /** @description Unexpected error */ - NotOk: { - headers: { - [name: string]: unknown; - }; - content: { - "application/json": components["schemas"]["ResponseInfo"]; - }; - }; + EngineInfo: { + engine_version: string; + }; + CreateEnclave: { + enclave_name: string; + api_container_version_tag: string; + /** @description Enclave log level, defaults to INFO */ + api_container_log_level?: string; + /** @description Enclave mode, defaults to TEST */ + mode?: components["schemas"]["EnclaveMode"]; + /** @description Whether the APIC's container should run with the debug server to receive a remote debug connection */ + should_apic_run_in_debug_mode?: components["schemas"]["ApiContainerDebugMode"]; + }; + /** @enum {string} */ + EnclaveMode: "TEST" | "PRODUCTION"; + /** @enum {string} */ + EnclaveStatus: "RUNNING" | "STOPPED" | "EMPTY"; + /** @enum {string} */ + EnclaveTargetStatus: "STOP"; + /** @enum {string} */ + ApiContainerStatus: "RUNNING" | "STOPPED" | "NON_EXISTENT"; + /** + * @default false + * @enum {boolean} + */ + ApiContainerDebugMode: false | true; + EnclaveInfo: { + enclave_uuid: string; + name: string; + shortened_uuid: string; + containers_status: components["schemas"]["EnclaveStatus"]; + api_container_status: components["schemas"]["ApiContainerStatus"]; + api_container_info?: components["schemas"]["EnclaveAPIContainerInfo"]; + api_container_host_machine_info?: components["schemas"]["EnclaveAPIContainerHostMachineInfo"]; + creation_time: components["schemas"]["Timestamp"]; + mode: components["schemas"]["EnclaveMode"]; + }; + EnclaveAPIContainerInfo: { + container_id: string; + ip_inside_enclave: string; + grpc_port_inside_enclave: number; + bridge_ip_address: string; + }; + EnclaveAPIContainerHostMachineInfo: { + ip_on_host_machine: string; + grpc_port_on_host_machine: number; + }; + EnclaveIdentifiers: { + enclave_uuid: string; + name: string; + shortened_uuid: string; + }; + EnclaveNameAndUuid: { + name: string; + uuid: string; + }; + DeletionSummary: { + removed_enclave_name_and_uuids?: components["schemas"]["EnclaveNameAndUuid"][]; + }; + /** Format: date-time */ + Timestamp: string; + /** @description Shared Objects (Used By Multiple Endpoints) */ + Port: { + /** Format: int32 */ + number: number; + transport_protocol: components["schemas"]["TransportProtocol"]; + application_protocol?: string; + /** @description The wait timeout duration in string */ + wait_timeout?: string; + }; + /** @enum {string} */ + HttpMethodAvailability: "GET" | "POST"; + Container: { + status: components["schemas"]["ContainerStatus"]; + image_name: string; + entrypoint_args: string[]; + cmd_args: string[]; + env_vars: { + [key: string]: string; + }; + }; + /** + * @description 0 - STOPPED + * 1 - RUNNING + * 2 - UNKNOWN + * @enum {string} + */ + ServiceStatus: "STOPPED" | "RUNNING" | "UNKNOWN"; + /** + * @description 0 - ALWAYS + * 1 - MISSING + * @enum {string} + */ + ImageDownloadMode: "ALWAYS" | "MISSING"; + ServiceInfo: { + /** @description UUID of the service */ + service_uuid: string; + /** @description The IP address of the service inside the enclave */ + private_ip_addr: string; + private_ports: { + [key: string]: components["schemas"]["Port"]; + }; + /** + * @description Public IP address *outside* the enclave where the service is reachable + * NOTE: Will be empty if the service isn't running, the service didn't define any ports, or the backend doesn't support reporting public service info + */ + public_ip_addr?: string; + public_ports?: { + [key: string]: components["schemas"]["Port"]; + }; + /** @description Name of the service */ + name: string; + /** @description Shortened uuid of the service */ + shortened_uuid: string; + service_status: components["schemas"]["ServiceStatus"]; + container: components["schemas"]["Container"]; + }; + /** + * @description 0 - CONNECT // Best effort port forwarding + * 1 - NO_CONNECT // Port forwarding disabled + * @enum {string} + */ + Connect: "CONNECT" | "NO_CONNECT"; + RunStarlarkScript: { + serialized_script: string; + /** @description Parameters data for the Starlark package main function */ + params?: { + [key: string]: unknown; + }; + /** @description Defaults to false */ + dry_run?: boolean; + /** + * Format: int32 + * @description Defaults to 4 + */ + parallelism?: number; + /** @description The name of the main function, the default value is "run" */ + main_function_name?: string; + experimental_features?: components["schemas"]["KurtosisFeatureFlag"][]; + /** @description Defaults to empty */ + cloud_instance_id?: string; + /** @description Defaults to empty */ + cloud_user_id?: string; + image_download_mode?: components["schemas"]["ImageDownloadMode"]; + /** @description Defaults to false */ + non_blocking_mode?: boolean; + }; + RunStarlarkPackage: { + /** @description Parameters data for the Starlark package main function */ + params?: { + [key: string]: unknown; + }; + /** @description Defaults to false */ + dry_run?: boolean; + /** + * Format: int32 + * @description Defaults to 4 + */ + parallelism?: number; + /** + * @description Whether the package should be cloned or not. + * If false, then the package will be pulled from the APIC local package store. If it's a local package then is must + * have been uploaded using UploadStarlarkPackage prior to calling RunStarlarkPackage. + * If true, then the package will be cloned from GitHub before execution starts + */ + clone_package?: boolean; + /** @description The relative main file filepath, the default value is the "main.star" file in the root of a package */ + relative_path_to_main_file?: string; + /** @description The name of the main function, the default value is "run" */ + main_function_name?: string; + experimental_features?: components["schemas"]["KurtosisFeatureFlag"][]; + /** @description Defaults to empty */ + cloud_instance_id?: string; + /** @description Defaults to empty */ + cloud_user_id?: string; + image_download_mode?: components["schemas"]["ImageDownloadMode"]; + /** @description Defaults to false */ + non_blocking_mode?: boolean; + /** @description Defaults to empty */ + github_auth_token?: string; + }; + /** + * @description 0 - NO_INSTRUCTIONS_CACHING + * @enum {string} + */ + KurtosisFeatureFlag: "NO_INSTRUCTIONS_CACHING"; + /** @description Starlark Execution Logs */ + StarlarkRunLogs: components["schemas"]["StarlarkRunResponseLine"][]; + /** @description Starlark Execution Response */ + StarlarkRunResponseLine: components["schemas"]["StarlarkInstruction"] | components["schemas"]["StarlarkError"] | components["schemas"]["StarlarkRunProgress"] | components["schemas"]["StarlarkInstructionResult"] | components["schemas"]["StarlarkRunFinishedEvent"] | components["schemas"]["StarlarkWarning"] | components["schemas"]["StarlarkInfo"]; + StarlarkInfo: { + info: { + instruction: { + info_message: string; + }; + }; + }; + StarlarkWarning: { + warning: { + warning_message: string; + }; + }; + StarlarkInstruction: { + position?: components["schemas"]["StarlarkInstructionPosition"]; + instruction_name: string; + arguments: components["schemas"]["StarlarkInstructionArgument"][]; + executable_instruction: string; + is_skipped: boolean; + }; + StarlarkInstructionResult: { + instruction_result: { + serialized_instruction_result: string; + }; + }; + StarlarkInstructionArgument: { + serialized_arg_value: string; + arg_name?: string; + is_representative: boolean; + }; + StarlarkInstructionPosition: { + filename: string; + /** Format: int32 */ + line: number; + /** Format: int32 */ + column: number; + }; + StarlarkError: { + error: components["schemas"]["StarlarkInterpretationError"] | components["schemas"]["StarlarkValidationError"] | components["schemas"]["StarlarkExecutionError"]; }; - parameters: { - /** @description UUID, shortened UUID, or name of the enclave */ - enclave_identifier: string; - /** @description The service identifier of the container that the command should be executed in */ - service_identifier: string; - /** @description The unique identifier to track the execution of a Starlark script or package */ + StarlarkInterpretationError: { + interpretation_error: { + error_message: string; + }; + }; + StarlarkValidationError: { + validation_error: { + error_message: string; + }; + }; + StarlarkExecutionError: { + execution_error: { + error_message: string; + }; + }; + StarlarkRunProgress: { + progress_info: { + current_step_info: string[]; + /** Format: int32 */ + total_steps: number; + /** Format: int32 */ + current_step_number: number; + }; + }; + StarlarkRunFinishedEvent: { + run_finished_event: { + is_run_successful: boolean; + serialized_output?: string; + }; + }; + /** @description Use it to asynchronously retrieve the execution logs via Websockets or http streaming */ + AsyncStarlarkExecutionLogs: { + /** @description Execution UUID to asynchronously retrieve the execution logs */ + async_starlark_execution_logs: { starlark_execution_uuid: string; - service_uuid_set: string[]; - /** @description If false, block http response until all logs are available. Default is true */ - retrieve_logs_async: boolean; - /** @description If true, remove all enclaves. Otherwise only remove stopped enclaves. Default is false */ - remove_all: boolean; - /** @description The port number to check availability */ - port_number: number; - /** @description The HTTP method used to check availability. Default is GET. */ - http_method: components["schemas"]["HttpMethodAvailability"]; - /** @description The path of the service to check. It mustn't start with the first slash. For instance `service/health` */ - path: string; - /** @description The number of milliseconds to wait until executing the first HTTP call */ - initial_delay_milliseconds: number; - /** @description Max number of HTTP call attempts that this will execute until giving up and returning an error */ - retries: number; - /** @description Number of milliseconds to wait between retries */ - retries_delay_milliseconds: number; - /** @description If the endpoint returns this value, the service will be marked as available (e.g. Hello World). */ - expected_response: string; - /** @description If the http_method is set to POST, this value will be send as the body of the availability request. */ - request_body: string; - /** @description The artifact name or uuid */ - artifact_identifier: string; - /** @description The package identifier that will be executed */ - package_id: string; - follow_logs: boolean; - conjunctive_filters: components["schemas"]["LogLineFilter"][]; - return_all_logs: boolean; - num_log_lines: number; - }; - requestBodies: { - fileUploadBody: { - content: { - "multipart/form-data": string; - }; - }; + }; + }; + StarlarkRunResponse: { + starlark_execution_logs?: components["schemas"]["AsyncStarlarkExecutionLogs"] | components["schemas"]["StarlarkRunLogs"]; + }; + /** @description An service identifier is a collection of uuid, name and shortened uuid */ + ServiceIdentifiers: { + /** @description UUID of the service */ + service_uuid: string; + /** @description Name of the service */ + name: string; + /** @description The shortened uuid of the service */ + shortened_uuid: string; + }; + /** @description Exec Command */ + ExecCommand: { + command_args: string[]; + }; + ExecCommandResult: { + /** Format: int32 */ + exit_code: number; + /** @description Assumes UTF-8 encoding */ + log_output: string; + }; + FileArtifactUploadResult: { + file_artifact_upload_result?: components["schemas"]["FileArtifactReference"] | components["schemas"]["ResponseInfo"]; + }; + /** @description Files Artifact identifier */ + FileArtifactReference: { + /** @description UUID of the files artifact, for use when referencing it in the future */ + uuid: string; + /** @description UUID of the files artifact, for use when referencing it in the future */ + name: string; }; - headers: never; - pathItems: never; + /** @description Store Web Files Artifact */ + StoreWebFilesArtifact: { + /** @description URL to download the artifact from */ + url: string; + /** @description The name of the files artifact */ + name: string; + }; + StoreFilesArtifactFromService: { + /** @description The absolute source path where the source files will be copied from */ + source_path: string; + /** @description The name of the files artifact */ + name: string; + }; + FileArtifactDescription: { + /** @description Path relative to the file artifact */ + path: string; + /** + * Format: int64 + * @description Size of the file, in bytes + */ + size: number; + /** @description A bit of text content, if the file allows (similar to UNIX's 'head') */ + text_preview?: string; + }; + /** + * @description 0 - NEVER + * 1 - ALWAYS + * @enum {string} + */ + RestartPolicy: "NEVER" | "ALWAYS"; + StarlarkDescription: { + package_id: string; + serialized_script: string; + serialized_params: string; + /** Format: int32 */ + parallelism: number; + relative_path_to_main_file: string; + main_function_name: string; + experimental_features: components["schemas"]["KurtosisFeatureFlag"][]; + restart_policy: components["schemas"]["RestartPolicy"]; + }; + /** + * @description 0 - TCP + * 1 - SCTP + * 2 - UDP + * @enum {string} + */ + TransportProtocol: "TCP" | "SCTP" | "UDP"; + /** + * @description 0 - STOPPED + * 1 - RUNNING + * 2 - UNKNOWN + * @enum {string} + */ + ContainerStatus: "STOPPED" | "RUNNING" | "UNKNOWN"; + ServiceLogs: { + service_logs_by_service_uuid?: { + [key: string]: components["schemas"]["LogLine"]; + }; + not_found_service_uuid_set?: string[]; + }; + LogLine: { + line: string[]; + timestamp: components["schemas"]["Timestamp"]; + }; + LogLineFilter: { + operator: components["schemas"]["LogLineOperator"]; + text_pattern: string; + }; + /** @enum {string} */ + LogLineOperator: "DOES_CONTAIN_TEXT" | "DOES_NOT_CONTAIN_TEXT" | "DOES_CONTAIN_MATCH_REGEX" | "DOES_NOT_CONTAIN_MATCH_REGEX"; + }; + responses: { + /** @description Unexpected error */ + NotOk: { + content: { + "application/json": components["schemas"]["ResponseInfo"]; + }; + }; + }; + parameters: { + /** @description UUID, shortened UUID, or name of the enclave */ + enclave_identifier: string; + /** @description The service identifier of the container that the command should be executed in */ + service_identifier: string; + /** @description The unique identifier to track the execution of a Starlark script or package */ + starlark_execution_uuid: string; + service_uuid_set: string[]; + /** @description If false, block http response until all logs are available. Default is true */ + retrieve_logs_async?: boolean; + /** @description If true, remove all enclaves. Otherwise only remove stopped enclaves. Default is false */ + remove_all?: boolean; + /** @description The port number to check availability */ + port_number: number; + /** @description The HTTP method used to check availability. Default is GET. */ + http_method?: components["schemas"]["HttpMethodAvailability"]; + /** @description The path of the service to check. It mustn't start with the first slash. For instance `service/health` */ + path?: string; + /** @description The number of milliseconds to wait until executing the first HTTP call */ + initial_delay_milliseconds?: number; + /** @description Max number of HTTP call attempts that this will execute until giving up and returning an error */ + retries?: number; + /** @description Number of milliseconds to wait between retries */ + retries_delay_milliseconds?: number; + /** @description If the endpoint returns this value, the service will be marked as available (e.g. Hello World). */ + expected_response?: string; + /** @description If the http_method is set to POST, this value will be send as the body of the availability request. */ + request_body?: string; + /** @description The artifact name or uuid */ + artifact_identifier: string; + /** @description The package identifier that will be executed */ + package_id: string; + follow_logs?: boolean; + conjunctive_filters?: components["schemas"]["LogLineFilter"][]; + return_all_logs?: boolean; + num_log_lines?: number; + }; + requestBodies: { + fileUploadBody?: { + content: { + "multipart/form-data": string; + }; + }; + }; + headers: never; + pathItems: never; } + export type $defs = Record; + +export type external = Record; + export type operations = Record; diff --git a/cli/cli/commands/github/logout/logout.go b/cli/cli/commands/github/logout/logout.go index a6ba7da499..0f2868cfc9 100644 --- a/cli/cli/commands/github/logout/logout.go +++ b/cli/cli/commands/github/logout/logout.go @@ -7,6 +7,7 @@ import ( "github.com/kurtosis-tech/kurtosis/cli/cli/command_framework/lowlevel/args" "github.com/kurtosis-tech/kurtosis/cli/cli/command_framework/lowlevel/flags" "github.com/kurtosis-tech/kurtosis/cli/cli/command_str_consts" + "github.com/kurtosis-tech/kurtosis/cli/cli/commands/github/login" "github.com/kurtosis-tech/kurtosis/cli/cli/helpers/github_auth_store" "github.com/kurtosis-tech/kurtosis/cli/cli/out" "github.com/kurtosis-tech/stacktrace" @@ -23,7 +24,7 @@ var LogoutCmd = &lowlevel.LowlevelKurtosisCommand{ PostValidationAndRunFunc: nil, } -func run(_ context.Context, _ *flags.ParsedFlags, _ *args.ParsedArgs) error { +func run(ctx context.Context, _ *flags.ParsedFlags, _ *args.ParsedArgs) error { githubAuthStore, err := github_auth_store.GetGitHubAuthStore() if err != nil { return stacktrace.Propagate(err, "An error occurred retrieving GitHub auth configuration.") @@ -40,6 +41,10 @@ func run(_ context.Context, _ *flags.ParsedFlags, _ *args.ParsedArgs) error { if err != nil { return stacktrace.Propagate(err, "An error occurred logging out GitHub user: %v", username) } + err = login.RestartEngineAfterGitHubAuth(ctx) + if err != nil { + return err + } out.PrintOutLn(fmt.Sprintf("Successfully logged GitHub user '%v' out of Kurtosis CLI", username)) return nil } diff --git a/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/consts/consts.go b/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/consts/consts.go index d609913803..a13632c54e 100644 --- a/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/consts/consts.go +++ b/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/consts/consts.go @@ -33,7 +33,6 @@ const ( HttpApplicationProtocol = "http" GitHubAuthStorageDirPath = "/kurtosis-data/github-auth/" - GithubAuthStorageToken = "token.txt" EmptyApplicationURL = "" ) diff --git a/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/engine_functions/create_engine.go b/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/engine_functions/create_engine.go index 5d3db73446..585c9e83cc 100644 --- a/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/engine_functions/create_engine.go +++ b/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/engine_functions/create_engine.go @@ -244,8 +244,7 @@ func CreateEngine( if err = dockerManager.CreateVolume(ctx, githubAuthStorageVolNameStr, githubAuthStorageVolLabelStrs); err != nil { return nil, stacktrace.Propagate(err, "An error occurred creating GitHub auth storage volume.") } - githubAuthStorageCreator := github_auth_storage_creator.NewGitHubAuthStorageCreator(gitAuthToken) - err = githubAuthStorageCreator.CreateGitHubAuthStorage(ctx, targetNetworkId, githubAuthStorageVolNameStr, consts.GitHubAuthStorageDirPath, dockerManager) + err = github_auth_storage_creator.CreateGitHubAuthStorage(ctx, targetNetworkId, githubAuthStorageVolNameStr, consts.GitHubAuthStorageDirPath, dockerManager, gitAuthToken) if err != nil { return nil, stacktrace.Propagate(err, "An error occurred creating GitHub auth storage.") } diff --git a/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/engine_functions/github_auth_storage_creator/github_auth_storage_creator.go b/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/engine_functions/github_auth_storage_creator/github_auth_storage_creator.go index 0118e464dd..f918ec4f92 100644 --- a/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/engine_functions/github_auth_storage_creator/github_auth_storage_creator.go +++ b/container-engine-lib/lib/backend_impls/docker/docker_kurtosis_backend/engine_functions/github_auth_storage_creator/github_auth_storage_creator.go @@ -28,23 +28,18 @@ const ( authStorageCreationCmdMaxRetries = 2 authStorageCreationCmdDelayInRetries = 200 * time.Millisecond + githubAuthTokenFilePath = "token.txt" + sleepSeconds = 1800 ) -type GitHubAuthStorageCreator struct { - token string -} - -func NewGitHubAuthStorageCreator(token string) *GitHubAuthStorageCreator { - return &GitHubAuthStorageCreator{token: token} -} - -func (creator *GitHubAuthStorageCreator) CreateGitHubAuthStorage( +func CreateGitHubAuthStorage( ctx context.Context, targetNetworkId string, volumeName string, githubAuthStorageDirPath string, dockerManager *docker_manager.DockerManager, + token string, ) error { entrypointArgs := []string{ shBinaryFilepath, @@ -82,13 +77,14 @@ func (creator *GitHubAuthStorageCreator) CreateGitHubAuthStorage( } }() - if err := creator.storeTokenInVolume( + if err := storeTokenInVolume( ctx, dockerManager, containerId, authStorageCreationCmdMaxRetries, authStorageCreationCmdDelayInRetries, githubAuthStorageDirPath, + token, ); err != nil { return stacktrace.Propagate(err, "An error occurred creating GitHub auth storage in volume.") } @@ -98,26 +94,27 @@ func (creator *GitHubAuthStorageCreator) CreateGitHubAuthStorage( // GetGitHubAuthToken Returns empty string if no token found in [githubAuthTokenFile] or [githubAuthTokenFile] doesn't exist func GetGitHubAuthToken() string { - tokenBytes, err := os.ReadFile(path.Join(consts.GitHubAuthStorageDirPath, consts.GithubAuthStorageToken)) + tokenBytes, err := os.ReadFile(path.Join(consts.GitHubAuthStorageDirPath, githubAuthTokenFilePath)) if err != nil { return "" } return string(tokenBytes) } -func (creator *GitHubAuthStorageCreator) storeTokenInVolume( +func storeTokenInVolume( ctx context.Context, dockerManager *docker_manager.DockerManager, containerId string, maxRetries uint, timeBetweenRetries time.Duration, githubAuthStorageDirPath string, + token string, ) error { commandStr := fmt.Sprintf( "%v '%v' > %v", printfCmdName, - creator.token, - fmt.Sprintf("%s/%s", githubAuthStorageDirPath, consts.GithubAuthStorageToken), + token, + fmt.Sprintf("%s/%s", githubAuthStorageDirPath, githubAuthTokenFilePath), ) execCmd := []string{ diff --git a/core/server/api_container/main.go b/core/server/api_container/main.go index 5b10c1c314..6541459b31 100644 --- a/core/server/api_container/main.go +++ b/core/server/api_container/main.go @@ -127,11 +127,12 @@ func runMain() error { return stacktrace.Propagate(err, "An error occurred while getting the enclave db") } - repositoriesDirPath, tempDirectoriesDirPath, githubAuthTokenFilePath, err := enclaveDataDir.GetEnclaveDataDirectoryPaths() + repositoriesDirPath, tempDirectoriesDirPath, githubAuthDirPath, err := enclaveDataDir.GetEnclaveDataDirectoryPaths() if err != nil { return stacktrace.Propagate(err, "An error occurred getting directory paths of the enclave data directory.") } - gitPackageContentProvider := git_package_content_provider.NewGitPackageContentProvider(repositoriesDirPath, tempDirectoriesDirPath, githubAuthTokenFilePath, enclaveDb) + githubAuthProvider := git_package_content_provider.NewGitHubPackageAuthProvider(githubAuthDirPath) + gitPackageContentProvider := git_package_content_provider.NewGitPackageContentProvider(repositoriesDirPath, tempDirectoriesDirPath, githubAuthProvider, enclaveDb) // TODO Extract into own function var kurtosisBackend backend_interface.KurtosisBackend @@ -237,6 +238,7 @@ func runMain() error { gitPackageContentProvider, restartPolicy, metricsClient, + githubAuthProvider, ) if err != nil { return stacktrace.Propagate(err, "An error occurred creating the API container service") diff --git a/core/server/api_container/server/api_container_service.go b/core/server/api_container/server/api_container_service.go index 4ba1e9d2d8..1158b4b01e 100644 --- a/core/server/api_container/server/api_container_service.go +++ b/core/server/api_container/server/api_container_service.go @@ -17,6 +17,7 @@ import ( "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/enclave_structure" "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/instructions_plan/resolver" "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/plan_yaml" + "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/startosis_packages/git_package_content_provider" "io" "math" "net/http" @@ -99,6 +100,8 @@ type ApiContainerService struct { starlarkRun *kurtosis_core_rpc_api_bindings.GetStarlarkRunResponse metricsClient metrics_client.MetricsClient + + githubAuthProvider *git_package_content_provider.GitHubPackageAuthProvider } func NewApiContainerService( @@ -109,6 +112,7 @@ func NewApiContainerService( startosisModuleContentProvider startosis_packages.PackageContentProvider, restartPolicy kurtosis_core_rpc_api_bindings.RestartPolicy, metricsClient metrics_client.MetricsClient, + githubAuthProvider *git_package_content_provider.GitHubPackageAuthProvider, ) (*ApiContainerService, error) { service := &ApiContainerService{ filesArtifactStore: filesArtifactStore, @@ -127,7 +131,8 @@ func NewApiContainerService( ExperimentalFeatures: []kurtosis_core_rpc_api_bindings.KurtosisFeatureFlag{}, RestartPolicy: kurtosis_core_rpc_api_bindings.RestartPolicy_NEVER, }, - metricsClient: metricsClient, + metricsClient: metricsClient, + githubAuthProvider: githubAuthProvider, } return service, nil @@ -247,7 +252,6 @@ func (apicService *ApiContainerService) InspectFilesArtifactContents(_ context.C } func (apicService *ApiContainerService) RunStarlarkPackage(args *kurtosis_core_rpc_api_bindings.RunStarlarkPackageArgs, stream kurtosis_core_rpc_api_bindings.ApiContainerService_RunStarlarkPackageServer) error { - var scriptWithRunFunction string var interpretationError *startosis_errors.InterpretationError var isRemote bool @@ -265,6 +269,17 @@ func (apicService *ApiContainerService) RunStarlarkPackage(args *kurtosis_core_r ApiDownloadMode := shared_utils.GetOrDefault(args.ImageDownloadMode, defaultImageDownloadMode) downloadMode := convertFromImageDownloadModeAPI(ApiDownloadMode) nonBlockingMode := args.GetNonBlockingMode() + + packageGitHubAuthToken := args.GetGithubAuthToken() + if packageGitHubAuthToken != "" { + err := apicService.githubAuthProvider.StoreGitHubTokenForPackage(packageIdFromArgs, args.GetGithubAuthToken()) + if err != nil { + if err = stream.SendMsg(binding_constructors.NewStarlarkExecutionError(err.Error())); err != nil { + return stacktrace.Propagate(err, "Error occurred providing github auth token for package: '%s'", packageIdFromArgs) + } + } + } + var actualRelativePathToMainFile string if args.ClonePackage != nil { scriptWithRunFunction, actualRelativePathToMainFile, detectedPackageId, detectedPackageReplaceOptions, interpretationError = diff --git a/core/server/api_container/server/startosis_engine/startosis_packages/git_package_content_provider/git_package_auth_provider.go b/core/server/api_container/server/startosis_engine/startosis_packages/git_package_content_provider/git_package_auth_provider.go new file mode 100644 index 0000000000..02146d07b7 --- /dev/null +++ b/core/server/api_container/server/startosis_engine/startosis_packages/git_package_content_provider/git_package_auth_provider.go @@ -0,0 +1,59 @@ +package git_package_content_provider + +import ( + "fmt" + "github.com/sirupsen/logrus" + "os" + "path" + "strings" +) + +const ( + // filename for storing a github auth token for a user + githubUserTokenFilename = "token.txt" + + githubTokenFilePerms = 0644 +) + +type GitHubPackageAuthProvider struct { + // Location inside APIC where GitHub auth info exists + githubAuthStorageDirPath string +} + +func NewGitHubPackageAuthProvider(githubAuthStorageDirPath string) *GitHubPackageAuthProvider { + return &GitHubPackageAuthProvider{ + githubAuthStorageDirPath: githubAuthStorageDirPath, + } +} + +func (gitAuth *GitHubPackageAuthProvider) StoreGitHubTokenForPackage(packageId, token string) error { + err := os.WriteFile(path.Join(gitAuth.githubAuthStorageDirPath, getGitHubTokenFileName(packageId)), []byte(token), githubTokenFilePerms) + if err != nil { + return err + } + logrus.Infof("Successfully stored GitHub auth token for package: '%v'", packageId) + return nil +} + +func (gitAuth *GitHubPackageAuthProvider) GetGitHubTokenForPackage(packageId string) string { + tokenBytes, err := os.ReadFile(path.Join(gitAuth.githubAuthStorageDirPath, getGitHubTokenFileName(packageId))) + if err != nil { + return "" + } + logrus.Infof("Retrieved GitHub auth token for package: '%v'", packageId) + return string(tokenBytes) +} + +// store as .txt, which is usually github locator, so swap out the slashes +func getGitHubTokenFileName(packageId string) string { + return fmt.Sprintf("%v.txt", strings.Replace(packageId, "/", "-", -1)) +} + +func (gitAuth *GitHubPackageAuthProvider) GetGitHubTokenForUser() string { + tokenBytes, err := os.ReadFile(path.Join(gitAuth.githubAuthStorageDirPath, githubUserTokenFilename)) + if err != nil { + return "" + } + logrus.Infof("Retrieved a GitHub auth token.") + return string(tokenBytes) +} diff --git a/core/server/api_container/server/startosis_engine/startosis_packages/git_package_content_provider/git_package_content_provider.go b/core/server/api_container/server/startosis_engine/startosis_packages/git_package_content_provider/git_package_content_provider.go index a33aea4229..836000d837 100644 --- a/core/server/api_container/server/startosis_engine/startosis_packages/git_package_content_provider/git_package_content_provider.go +++ b/core/server/api_container/server/startosis_engine/startosis_packages/git_package_content_provider/git_package_content_provider.go @@ -14,11 +14,9 @@ import ( "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/startosis_errors" "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/startosis_packages" "github.com/kurtosis-tech/kurtosis/core/server/commons/yaml_parser" - "github.com/kurtosis-tech/stacktrace" "github.com/mholt/archiver" "github.com/sirupsen/logrus" "io" - "io/fs" "os" "path" "path/filepath" @@ -57,15 +55,14 @@ type GitPackageContentProvider struct { repositoriesTmpDir string repositoriesDir string packageReplaceOptionsRepository *packageReplaceOptionsRepository - - githubAuthTokenFile string + githubAuthProvider *GitHubPackageAuthProvider } -func NewGitPackageContentProvider(repositoriesDir, tmpDir, githubAuthTokenFile string, enclaveDb *enclave_db.EnclaveDB) *GitPackageContentProvider { +func NewGitPackageContentProvider(repositoriesDir, tmpDir string, githubAuthProvider *GitHubPackageAuthProvider, enclaveDb *enclave_db.EnclaveDB) *GitPackageContentProvider { return &GitPackageContentProvider{ repositoriesDir: repositoriesDir, repositoriesTmpDir: tmpDir, - githubAuthTokenFile: githubAuthTokenFile, + githubAuthProvider: githubAuthProvider, packageReplaceOptionsRepository: newPackageReplaceOptionsRepository(enclaveDb), } } @@ -76,7 +73,7 @@ func (provider *GitPackageContentProvider) ClonePackage(packageId string) (strin return "", startosis_errors.WrapWithInterpretationError(err, "An error occurred parsing Git URL for package ID '%s'", packageId) } - if interpretationError := provider.atomicClone(parsedURL); interpretationError != nil { + if interpretationError := provider.atomicClone(parsedURL, provider.getGitHubAuthToken(packageId)); interpretationError != nil { return "", interpretationError } @@ -140,7 +137,8 @@ func (provider *GitPackageContentProvider) getOnDiskAbsolutePath(absoluteLocator } // Otherwise clone the repo and return the absolute path of the requested file - if interpretationError := provider.atomicClone(parsedURL); interpretationError != nil { + emptyPackageId := "" + if interpretationError := provider.atomicClone(parsedURL, provider.getGitHubAuthToken(emptyPackageId)); interpretationError != nil { return "", interpretationError } @@ -327,7 +325,7 @@ func (provider *GitPackageContentProvider) CloneReplacedPackagesIfNeeded(current // atomicClone This first clones to a temporary directory and then moves it into the package file system // TODO make this support versioning via tags, commit hashes or branches -func (provider *GitPackageContentProvider) atomicClone(parsedURL *shared_utils.ParsedGitURL) *startosis_errors.InterpretationError { +func (provider *GitPackageContentProvider) atomicClone(parsedURL *shared_utils.ParsedGitURL, githubAuthToken string) *startosis_errors.InterpretationError { // First we clone into a temporary directory tempRepoDirPath, err := os.MkdirTemp(provider.repositoriesTmpDir, temporaryRepoDirPattern) if err != nil { @@ -342,10 +340,6 @@ func (provider *GitPackageContentProvider) atomicClone(parsedURL *shared_utils.P } var githubAuth *http.BasicAuth - githubAuthToken, err := provider.getGitHubAuthToken() - if err != nil { - return startosis_errors.WrapWithInterpretationError(err, "An error occurred retrieving GitHub auth token.") - } if githubAuthToken != "" { githubAuth = &http.BasicAuth{ Username: "token", @@ -446,16 +440,16 @@ func (provider *GitPackageContentProvider) atomicClone(parsedURL *shared_utils.P return nil } -// Returns empty string if no token found in [githubAuthTokenFile] or [githubAuthTokenFile] doesn't exist -func (provider *GitPackageContentProvider) getGitHubAuthToken() (string, error) { - tokenBytes, err := os.ReadFile(provider.githubAuthTokenFile) - if err != nil { - if errors.Is(err, fs.ErrNotExist) { - return "", nil - } - return "", stacktrace.Propagate(err, "An error occurred reading contents at '%v' to retrieve GitHub auth token.", provider.githubAuthTokenFile) +// Returns empty string if no token found by [githubAuthProvider] +// If packageId is empty string, only checks for and returns github token for the user if it exists +func (provider *GitPackageContentProvider) getGitHubAuthToken(packageId string) string { + var githubAuthToken string + githubAuthToken = provider.githubAuthProvider.GetGitHubTokenForPackage(packageId) + if githubAuthToken != "" { + return githubAuthToken } - return string(tokenBytes), nil + githubAuthToken = provider.githubAuthProvider.GetGitHubTokenForUser() + return githubAuthToken } // methods checks whether the root of the package is same as repository root diff --git a/core/server/api_container/server/startosis_engine/startosis_packages/git_package_content_provider/git_package_content_provider_test.go b/core/server/api_container/server/startosis_engine/startosis_packages/git_package_content_provider/git_package_content_provider_test.go index 9a77ad8397..85fe185a33 100644 --- a/core/server/api_container/server/startosis_engine/startosis_packages/git_package_content_provider/git_package_content_provider_test.go +++ b/core/server/api_container/server/startosis_engine/startosis_packages/git_package_content_provider/git_package_content_provider_test.go @@ -21,7 +21,6 @@ const ( packagesDirRelPath = "startosis-packages" repositoriesTmpDirRelPath = "tmp-repositories" githubAuthDirRelPath = "github-auth" - githubAuthTokenFilename = "token.txt" packageDescriptionForTest = "package description test" localAbsoluteLocatorNotAllowedMsg = "is referencing a file within the same package using absolute import syntax" ) @@ -37,11 +36,10 @@ func TestGitPackageProvider_SucceedsForValidKurtosisPackage(t *testing.T) { defer os.RemoveAll(packageTmpDir) githubAuthDir, err := os.MkdirTemp("", githubAuthDirRelPath) require.Nil(t, err) - githubAuthTokenFilePath, err := os.CreateTemp(githubAuthDir, githubAuthTokenFilename) - require.Nil(t, err) defer os.RemoveAll(githubAuthDir) - provider := NewGitPackageContentProvider(packageDir, packageTmpDir, githubAuthTokenFilePath.Name(), nil) + githubAuthProvider := NewGitHubPackageAuthProvider(githubAuthDir) + provider := NewGitPackageContentProvider(packageDir, packageTmpDir, githubAuthProvider, nil) sampleStartosisModule := "github.com/kurtosis-tech/sample-startosis-load/sample.star" @@ -61,11 +59,10 @@ func TestGitPackageProvider_SucceedsForValidDockerComposePackage(t *testing.T) { defer os.RemoveAll(packageTmpDir) githubAuthDir, err := os.MkdirTemp("", githubAuthDirRelPath) require.Nil(t, err) - githubAuthTokenFilePath, err := os.CreateTemp(githubAuthDir, githubAuthTokenFilename) - require.Nil(t, err) defer os.RemoveAll(githubAuthDir) - provider := NewGitPackageContentProvider(packageDir, packageTmpDir, githubAuthTokenFilePath.Name(), nil) + githubAuthProvider := NewGitHubPackageAuthProvider(githubAuthDir) + provider := NewGitPackageContentProvider(packageDir, packageTmpDir, githubAuthProvider, nil) sampleComposeModule := "github.com/kurtosis-tech/django-compose/docker-compose.yml" @@ -85,11 +82,10 @@ func TestGitPackageProvider_SucceedsForValidPackageWithExplicitMasterSet(t *test defer os.RemoveAll(packageTmpDir) githubAuthDir, err := os.MkdirTemp("", githubAuthDirRelPath) require.Nil(t, err) - githubAuthTokenFilePath, err := os.CreateTemp(githubAuthDir, githubAuthTokenFilename) - require.Nil(t, err) defer os.RemoveAll(githubAuthDir) - provider := NewGitPackageContentProvider(packageDir, packageTmpDir, githubAuthTokenFilePath.Name(), nil) + githubAuthProvider := NewGitHubPackageAuthProvider(githubAuthDir) + provider := NewGitPackageContentProvider(packageDir, packageTmpDir, githubAuthProvider, nil) sampleStartosisModule := "github.com/kurtosis-tech/sample-startosis-load/sample.star@main" @@ -109,11 +105,10 @@ func TestGitPackageProvider_SucceedsForValidPackageWithBranch(t *testing.T) { defer os.RemoveAll(packageTmpDir) githubAuthDir, err := os.MkdirTemp("", githubAuthDirRelPath) require.Nil(t, err) - githubAuthTokenFilePath, err := os.CreateTemp(githubAuthDir, githubAuthTokenFilename) - require.Nil(t, err) defer os.RemoveAll(githubAuthDir) - provider := NewGitPackageContentProvider(packageDir, packageTmpDir, githubAuthTokenFilePath.Name(), nil) + githubAuthProvider := NewGitHubPackageAuthProvider(githubAuthDir) + provider := NewGitPackageContentProvider(packageDir, packageTmpDir, githubAuthProvider, nil) sampleStartosisModule := "github.com/kurtosis-tech/sample-startosis-load/sample.star@test-branch" @@ -133,11 +128,10 @@ func TestGitPackageProvider_FailsForInvalidBranch(t *testing.T) { defer os.RemoveAll(packageTmpDir) githubAuthDir, err := os.MkdirTemp("", githubAuthDirRelPath) require.Nil(t, err) - githubAuthTokenFilePath, err := os.CreateTemp(githubAuthDir, githubAuthTokenFilename) - require.Nil(t, err) defer os.RemoveAll(githubAuthDir) - provider := NewGitPackageContentProvider(packageDir, packageTmpDir, githubAuthTokenFilePath.Name(), nil) + githubAuthProvider := NewGitHubPackageAuthProvider(githubAuthDir) + provider := NewGitPackageContentProvider(packageDir, packageTmpDir, githubAuthProvider, nil) sampleStartosisModule := "github.com/kurtosis-tech/sample-startosis-load/sample.star@non-existent-branch" @@ -156,11 +150,10 @@ func TestGitPackageProvider_SucceedsForValidPackageWithTag(t *testing.T) { defer os.RemoveAll(packageTmpDir) githubAuthDir, err := os.MkdirTemp("", githubAuthDirRelPath) require.Nil(t, err) - githubAuthTokenFilePath, err := os.CreateTemp(githubAuthDir, githubAuthTokenFilename) - require.Nil(t, err) defer os.RemoveAll(githubAuthDir) - provider := NewGitPackageContentProvider(packageDir, packageTmpDir, githubAuthTokenFilePath.Name(), nil) + githubAuthProvider := NewGitHubPackageAuthProvider(githubAuthDir) + provider := NewGitPackageContentProvider(packageDir, packageTmpDir, githubAuthProvider, nil) sampleStartosisModule := "github.com/kurtosis-tech/sample-startosis-load/sample.star@0.1.1" @@ -180,11 +173,10 @@ func TestGitPackageProvider_SucceedsForValidPackageWithCommit(t *testing.T) { defer os.RemoveAll(packageTmpDir) githubAuthDir, err := os.MkdirTemp("", githubAuthDirRelPath) require.Nil(t, err) - githubAuthTokenFilePath, err := os.CreateTemp(githubAuthDir, githubAuthTokenFilename) - require.Nil(t, err) defer os.RemoveAll(githubAuthDir) - provider := NewGitPackageContentProvider(packageDir, packageTmpDir, githubAuthTokenFilePath.Name(), nil) + githubAuthProvider := NewGitHubPackageAuthProvider(githubAuthDir) + provider := NewGitPackageContentProvider(packageDir, packageTmpDir, githubAuthProvider, nil) sampleStartosisModule := "github.com/kurtosis-tech/sample-startosis-load/sample.star@ec9062828e1a687a5db7dfa750f754f88119e4c0" @@ -204,11 +196,10 @@ func TestGitPackageProvider_SucceedsForValidPackageWithCommitOnABranch(t *testin defer os.RemoveAll(packageTmpDir) githubAuthDir, err := os.MkdirTemp("", githubAuthDirRelPath) require.Nil(t, err) - githubAuthTokenFilePath, err := os.CreateTemp(githubAuthDir, githubAuthTokenFilename) - require.Nil(t, err) defer os.RemoveAll(githubAuthDir) - provider := NewGitPackageContentProvider(packageDir, packageTmpDir, githubAuthTokenFilePath.Name(), nil) + githubAuthProvider := NewGitHubPackageAuthProvider(githubAuthDir) + provider := NewGitPackageContentProvider(packageDir, packageTmpDir, githubAuthProvider, nil) sampleStartosisModule := "github.com/kurtosis-tech/sample-startosis-load/sample.star@df88baf51caffbe7e8f66c0e54715f680f4482b2" @@ -228,11 +219,10 @@ func TestGitPackageProvider_SucceedsForNonStarlarkFile(t *testing.T) { defer os.RemoveAll(packageTmpDir) githubAuthDir, err := os.MkdirTemp("", githubAuthDirRelPath) require.Nil(t, err) - githubAuthTokenFilePath, err := os.CreateTemp(githubAuthDir, githubAuthTokenFilename) - require.Nil(t, err) defer os.RemoveAll(githubAuthDir) - provider := NewGitPackageContentProvider(packageDir, packageTmpDir, githubAuthTokenFilePath.Name(), nil) + githubAuthProvider := NewGitHubPackageAuthProvider(githubAuthDir) + provider := NewGitPackageContentProvider(packageDir, packageTmpDir, githubAuthProvider, nil) // TODO replace this with something local or static sampleStarlarkPackage := "github.com/kurtosis-tech/prometheus-package/static-files/prometheus.yml.tmpl" @@ -245,19 +235,18 @@ func TestGitPackageProvider_SucceedsForNonStarlarkFile(t *testing.T) { } func TestGitPackageProvider_FailsForNonExistentPackage(t *testing.T) { - oackageDir, err := os.MkdirTemp("", packagesDirRelPath) + packageDir, err := os.MkdirTemp("", packagesDirRelPath) require.Nil(t, err) - defer os.RemoveAll(oackageDir) + defer os.RemoveAll(packageDir) packageTmpDir, err := os.MkdirTemp("", repositoriesTmpDirRelPath) require.Nil(t, err) defer os.RemoveAll(packageTmpDir) githubAuthDir, err := os.MkdirTemp("", githubAuthDirRelPath) require.Nil(t, err) - githubAuthTokenFilePath, err := os.CreateTemp(githubAuthDir, githubAuthTokenFilename) - require.Nil(t, err) defer os.RemoveAll(githubAuthDir) - provider := NewGitPackageContentProvider(oackageDir, packageTmpDir, githubAuthTokenFilePath.Name(), nil) + githubAuthProvider := NewGitHubPackageAuthProvider(githubAuthDir) + provider := NewGitPackageContentProvider(packageDir, packageTmpDir, githubAuthProvider, nil) nonExistentModulePath := "github.com/kurtosis-tech/non-existent-startosis-load/sample.star" nonExistentModuleAbsoluteLocator := startosis_packages.NewPackageAbsoluteLocator(nonExistentModulePath, defaultMainBranch) @@ -275,11 +264,10 @@ func TestGitPackageProvider_GetContentFromAbsoluteLocatorWithCommit(t *testing.T defer os.RemoveAll(packageTmpDir) githubAuthDir, err := os.MkdirTemp("", githubAuthDirRelPath) require.Nil(t, err) - githubAuthTokenFilePath, err := os.CreateTemp(githubAuthDir, githubAuthTokenFilename) - require.Nil(t, err) defer os.RemoveAll(githubAuthDir) - provider := NewGitPackageContentProvider(packageDir, packageTmpDir, githubAuthTokenFilePath.Name(), nil) + githubAuthProvider := NewGitHubPackageAuthProvider(githubAuthDir) + provider := NewGitPackageContentProvider(packageDir, packageTmpDir, githubAuthProvider, nil) absoluteLocatorStr := "github.com/kurtosis-tech/ethereum-package/src/package_io/input_parser.star" commitHash := "da55be84861e93ce777076e545abee35ff2d51ce" @@ -300,11 +288,10 @@ func TestGitPackageProvider_GetContentFromAbsoluteLocatorWithCommitComparedWithM defer os.RemoveAll(packageTmpDir) githubAuthDir, err := os.MkdirTemp("", githubAuthDirRelPath) require.Nil(t, err) - githubAuthTokenFilePath, err := os.CreateTemp(githubAuthDir, githubAuthTokenFilename) - require.Nil(t, err) defer os.RemoveAll(githubAuthDir) - provider := NewGitPackageContentProvider(packageDir, packageTmpDir, githubAuthTokenFilePath.Name(), nil) + githubAuthProvider := NewGitHubPackageAuthProvider(githubAuthDir) + provider := NewGitPackageContentProvider(packageDir, packageTmpDir, githubAuthProvider, nil) absoluteLocatorStr := "github.com/kurtosis-tech/another-sample-dependency-package/directory/internal-module.star" commitHashInMainBranch := "" @@ -323,11 +310,9 @@ func TestGitPackageProvider_GetContentFromAbsoluteLocatorWithCommitComparedWithM defer os.RemoveAll(packageTmpDir) githubAuthDir, err = os.MkdirTemp("", githubAuthDirRelPath) require.Nil(t, err) - githubAuthTokenFilePath, err = os.CreateTemp(githubAuthDir, githubAuthTokenFilename) - require.Nil(t, err) defer os.RemoveAll(githubAuthDir) - provider2 := NewGitPackageContentProvider(packageDir, packageTmpDir, githubAuthTokenFilePath.Name(), nil) + provider2 := NewGitPackageContentProvider(packageDir, packageTmpDir, githubAuthProvider, nil) commitHashInAnotherBranch := "f610049f1f9174bce871431af7d5d35cb6bfd76d" @@ -350,11 +335,10 @@ func TestGetAbsolutePathOnDisk_WorksForPureDirectories(t *testing.T) { defer os.RemoveAll(packageTmpDir) githubAuthDir, err := os.MkdirTemp("", githubAuthDirRelPath) require.Nil(t, err) - githubAuthTokenFilePath, err := os.CreateTemp(githubAuthDir, githubAuthTokenFilename) - require.Nil(t, err) defer os.RemoveAll(githubAuthDir) - provider := NewGitPackageContentProvider(packageDir, packageTmpDir, githubAuthTokenFilePath.Name(), nil) + githubAuthProvider := NewGitHubPackageAuthProvider(githubAuthDir) + provider := NewGitPackageContentProvider(packageDir, packageTmpDir, githubAuthProvider, nil) packagePath := "github.com/kurtosis-tech/datastore-army-package/src/helpers.star" @@ -375,11 +359,10 @@ func TestGetAbsolutePathOnDisk_WorksForNonInMainBranchLocators(t *testing.T) { defer os.RemoveAll(packageTmpDir) githubAuthDir, err := os.MkdirTemp("", githubAuthDirRelPath) require.Nil(t, err) - githubAuthTokenFilePath, err := os.CreateTemp(githubAuthDir, githubAuthTokenFilename) - require.Nil(t, err) defer os.RemoveAll(githubAuthDir) - provider := NewGitPackageContentProvider(packageDir, packageTmpDir, githubAuthTokenFilePath.Name(), nil) + githubAuthProvider := NewGitHubPackageAuthProvider(githubAuthDir) + provider := NewGitPackageContentProvider(packageDir, packageTmpDir, githubAuthProvider, nil) absoluteFileLocator := "github.com/kurtosis-tech/sample-dependency-package@test-branch/main.star" @@ -398,15 +381,12 @@ func TestGetAbsolutePathOnDisk_GenericRepositoryDir(t *testing.T) { repositoriesTmpDir, err := os.MkdirTemp("", repositoriesTmpDirRelPath) require.Nil(t, err) defer os.RemoveAll(repositoriesTmpDir) - githubAuthDir, err := os.MkdirTemp("", githubAuthDirRelPath) require.Nil(t, err) - githubAuthTokenFilePath, err := os.CreateTemp(githubAuthDir, githubAuthTokenFilename) - require.Nil(t, err) defer os.RemoveAll(githubAuthDir) - provider := NewGitPackageContentProvider(repositoriesDir, repositoriesTmpDir, githubAuthTokenFilePath.Name(), nil) - + githubAuthProvider := NewGitHubPackageAuthProvider(githubAuthDir) + provider := NewGitPackageContentProvider(repositoriesDir, repositoriesTmpDir, githubAuthProvider, nil) repositoryPathURL := "github.com/kurtosis-tech/minimal-grpc-server/golang/scripts" absoluteLocator := startosis_packages.NewPackageAbsoluteLocator(repositoryPathURL, defaultMainBranch) @@ -428,11 +408,10 @@ func TestGetAbsolutePathOnDisk_GenericRepositoryFile(t *testing.T) { githubAuthDir, err := os.MkdirTemp("", githubAuthDirRelPath) require.Nil(t, err) - githubAuthTokenFilePath, err := os.CreateTemp(githubAuthDir, githubAuthTokenFilename) - require.Nil(t, err) defer os.RemoveAll(githubAuthDir) - provider := NewGitPackageContentProvider(repositoriesDir, repositoriesTmpDir, githubAuthTokenFilePath.Name(), nil) + githubAuthProvider := NewGitHubPackageAuthProvider(githubAuthDir) + provider := NewGitPackageContentProvider(repositoriesDir, repositoriesTmpDir, githubAuthProvider, nil) repositoryPathURL := "github.com/kurtosis-tech/minimal-grpc-server/golang/scripts/build.sh" @@ -445,7 +424,7 @@ func TestGetAbsolutePathOnDisk_GenericRepositoryFile(t *testing.T) { } func TestGetAbsoluteLocator_SucceedsForRelativeFile(t *testing.T) { - provider := NewGitPackageContentProvider("", "", "", nil) + provider := NewGitPackageContentProvider("", "", NewGitHubPackageAuthProvider(""), nil) packageId := "github.com/kurtosis-tech/avalanche-package" parentModuleId := "github.com/kurtosis-tech/avalanche-package/src/builder.star" @@ -466,7 +445,7 @@ func TestGetAbsoluteLocator_SucceedsForRelativeFile(t *testing.T) { } func TestGetAbsoluteLocator_RegularReplaceSucceeds(t *testing.T) { - provider := NewGitPackageContentProvider("", "", "", nil) + provider := NewGitPackageContentProvider("", "", NewGitHubPackageAuthProvider(""), nil) packageId := "github.com/kurtosis-tech/sample-startosis-load/sample-package" parentModuleId := "github.com/kurtosis-tech/sample-startosis-load/sample-package/main.star" @@ -483,7 +462,7 @@ func TestGetAbsoluteLocator_RegularReplaceSucceeds(t *testing.T) { } func TestGetAbsoluteLocator_AnotherPackageWithCommitReplaceSucceeds(t *testing.T) { - provider := NewGitPackageContentProvider("", "", "", nil) + provider := NewGitPackageContentProvider("", "", NewGitHubPackageAuthProvider(""), nil) packageId := "github.com/kurtosis-tech/sample-startosis-load/sample-package" parentModuleId := "github.com/kurtosis-tech/sample-startosis-load/sample-package/main.star" @@ -499,7 +478,7 @@ func TestGetAbsoluteLocator_AnotherPackageWithCommitReplaceSucceeds(t *testing.T } func TestGetAbsoluteLocator_RootPackageReplaceSucceeds(t *testing.T) { - provider := NewGitPackageContentProvider("", "", "", nil) + provider := NewGitPackageContentProvider("", "", NewGitHubPackageAuthProvider(""), nil) packageId := "github.com/kurtosis-tech/sample-startosis-load/sample-package" parentModuleId := "github.com/kurtosis-tech/sample-startosis-load/sample-package/main.star" @@ -517,7 +496,7 @@ func TestGetAbsoluteLocator_RootPackageReplaceSucceeds(t *testing.T) { } func TestGetAbsoluteLocator_SubPackageReplaceSucceeds(t *testing.T) { - provider := NewGitPackageContentProvider("", "", "", nil) + provider := NewGitPackageContentProvider("", "", NewGitHubPackageAuthProvider(""), nil) packageId := "github.com/kurtosis-tech/sample-startosis-load/sample-package" parentModuleId := "github.com/kurtosis-tech/sample-startosis-load/sample-package/main.star" @@ -535,7 +514,7 @@ func TestGetAbsoluteLocator_SubPackageReplaceSucceeds(t *testing.T) { } func TestGetAbsoluteLocator_ReplacePackageInternalModuleSucceeds(t *testing.T) { - provider := NewGitPackageContentProvider("", "", "", nil) + provider := NewGitPackageContentProvider("", "", NewGitHubPackageAuthProvider(""), nil) packageId := "github.com/kurtosis-tech/sample-startosis-load/sample-package" parentModuleId := "github.com/kurtosis-tech/sample-startosis-load/sample-package/main.star" @@ -551,7 +530,7 @@ func TestGetAbsoluteLocator_ReplacePackageInternalModuleSucceeds(t *testing.T) { } func TestGetAbsoluteLocator_NoMainBranchReplaceSucceeds(t *testing.T) { - provider := NewGitPackageContentProvider("", "", "", nil) + provider := NewGitPackageContentProvider("", "", NewGitHubPackageAuthProvider(""), nil) packageId := "github.com/kurtosis-tech/sample-startosis-load/sample-package" parentModuleId := "github.com/kurtosis-tech/sample-startosis-load/sample-package/main.star" @@ -567,7 +546,7 @@ func TestGetAbsoluteLocator_NoMainBranchReplaceSucceeds(t *testing.T) { } func TestGetAbsoluteLocator_ShouldBlockSamePackageAbsoluteLocator(t *testing.T) { - provider := NewGitPackageContentProvider("", "", "", nil) + provider := NewGitPackageContentProvider("", "", NewGitHubPackageAuthProvider(""), nil) packageId := "github.com/main-package" locatorOfModuleInWhichThisBuiltInIsBeingCalled := "github.com/main-package/main.star" @@ -578,7 +557,7 @@ func TestGetAbsoluteLocator_ShouldBlockSamePackageAbsoluteLocator(t *testing.T) } func TestGetAbsoluteLocator_ShouldBlockSamePackageAbsoluteLocatorInSubfolder(t *testing.T) { - provider := NewGitPackageContentProvider("", "", "", nil) + provider := NewGitPackageContentProvider("", "", NewGitHubPackageAuthProvider(""), nil) packageId := "github.com/main-package" locatorOfModuleInWhichThisBuiltInIsBeingCalled := "github.com/main-package/main.star" @@ -589,7 +568,7 @@ func TestGetAbsoluteLocator_ShouldBlockSamePackageAbsoluteLocatorInSubfolder(t * } func TestGetAbsoluteLocator_SameRepositorySubpackagesShouldNotBeBlocked(t *testing.T) { - provider := NewGitPackageContentProvider("", "", "", nil) + provider := NewGitPackageContentProvider("", "", NewGitHubPackageAuthProvider(""), nil) packageId := "github.com/main-project/package1-in-subfolder" locatorOfModuleInWhichThisBuiltInIsBeingCalled := "github.com/main-project/package1-in-subfolder/main.star" @@ -600,7 +579,7 @@ func TestGetAbsoluteLocator_SameRepositorySubpackagesShouldNotBeBlocked(t *testi } func TestGetAbsoluteLocator_RelativeLocatorShouldNotBeBlocked(t *testing.T) { - provider := NewGitPackageContentProvider("", "", "", nil) + provider := NewGitPackageContentProvider("", "", NewGitHubPackageAuthProvider(""), nil) packageId := "github.com/main-package" locatorOfModuleInWhichThisBuiltInIsBeingCalled := "github.com/main-package/main.star" @@ -611,7 +590,7 @@ func TestGetAbsoluteLocator_RelativeLocatorShouldNotBeBlocked(t *testing.T) { } func TestGetAbsoluteLocator_AbsoluteLocatorIsInRootPackageButSourceIsNotShouldNotBeBlocked(t *testing.T) { - provider := NewGitPackageContentProvider("", "", "", nil) + provider := NewGitPackageContentProvider("", "", NewGitHubPackageAuthProvider(""), nil) packageId := "github.com/main-package" locatorOfModuleInWhichThisBuiltInIsBeingCalled := "github.com/child-package/main.star" @@ -838,16 +817,14 @@ func TestCloneReplacedPackagesIfNeeded_Succeeds(t *testing.T) { packageTmpDir, err := os.MkdirTemp("", repositoriesTmpDirRelPath) require.Nil(t, err) defer os.RemoveAll(packageTmpDir) - githubAuthDir, err := os.MkdirTemp("", githubAuthDirRelPath) require.Nil(t, err) - githubAuthTokenFilePath, err := os.CreateTemp(githubAuthDir, githubAuthTokenFilename) - require.Nil(t, err) defer os.RemoveAll(githubAuthDir) enclaveDb := getEnclaveDbForTest(t) - provider := NewGitPackageContentProvider(packageDir, packageTmpDir, githubAuthTokenFilePath.Name(), enclaveDb) + githubAuthProvider := NewGitHubPackageAuthProvider(githubAuthDir) + provider := NewGitPackageContentProvider(packageDir, packageTmpDir, githubAuthProvider, enclaveDb) firstRunReplacePackageOptions := map[string]string{ "github.com/kurtosis-tech/sample-dependency-package": "../from-local-folder", diff --git a/core/server/commons/enclave_data_directory/enclave_data_directory.go b/core/server/commons/enclave_data_directory/enclave_data_directory.go index f11e8fe449..3c1ba516ab 100644 --- a/core/server/commons/enclave_data_directory/enclave_data_directory.go +++ b/core/server/commons/enclave_data_directory/enclave_data_directory.go @@ -27,9 +27,6 @@ const ( // Name of directory INSIDE THE ENCLAVE DATA DIR at [absMountDirPath] that contains info for authenticating GitHub operations githubAuthStoreDirname = "github-auth" - - // Name of file within [githubAuthStoreDirname] that contains the GitHub auth token - githubAuthTokenFilename = "token.txt" ) // A directory containing all the data associated with a certain enclave (i.e. a Docker subnetwork where services are spun up) @@ -85,7 +82,6 @@ func (dir EnclaveDataDirectory) GetEnclaveDataDirectoryPaths() (string, string, if err := ensureDirpathExists(githubAuthStoreDirpath); err != nil { return "", "", "", stacktrace.Propagate(err, "An error occurred ensuring the GitHub auth store dirpath '%v' exists.", githubAuthStoreDirpath) } - githubAuthTokenFilepath := path.Join(dir.absMountDirpath, githubAuthStoreDirname, githubAuthTokenFilename) - return repositoriesStoreDirpath, tempRepositoriesStoreDirpath, githubAuthTokenFilepath, nil + return repositoriesStoreDirpath, tempRepositoriesStoreDirpath, githubAuthStoreDirpath, nil } diff --git a/engine/server/engine/server/enclave_rest_api_handler.go b/engine/server/engine/server/enclave_rest_api_handler.go index 14f89c5031..8e8d690685 100644 --- a/engine/server/engine/server/enclave_rest_api_handler.go +++ b/engine/server/engine/server/enclave_rest_api_handler.go @@ -602,6 +602,7 @@ func (manager *enclaveRuntime) PostEnclavesEnclaveIdentifierStarlarkPackagesPack // clone_package below StarlarkPackageContent: nil, NonBlockingMode: request.Body.NonBlockingMode, + GithubAuthToken: request.Body.GithubAuthToken, } ctxWithCancel, cancelCtxFunc := context.WithCancel(context.Background())