From 73d023bfbfd1201a4155a7ac3265fdfb5291d06b Mon Sep 17 00:00:00 2001 From: wlwilliamx Date: Tue, 30 Aug 2022 13:28:50 +0800 Subject: [PATCH 01/19] feat(oss api): support ceph oss Fit ceph object gateway, so that we can use Layotto to store object into CEPH. --- .gitignore | 1 + cmd/layotto/main.go | 3 + cmd/layotto_multiple_api/main.go | 3 + cmd/layotto_without_xds/main.go | 3 + components/oss/ceph/option.go | 43 + components/oss/ceph/option_test.go | 52 + components/oss/ceph/oss.go | 649 ++ components/oss/ceph/oss_test.go | 535 ++ components/oss/oss.go | 56 +- spec/proto/extension/v1/s3/oss.pb.go | 7179 +++++++++++++---------- spec/proto/extension/v1/s3/oss.proto | 138 + spec/proto/runtime/v1/appcallback.pb.go | 2 +- spec/proto/runtime/v1/runtime.pb.go | 2 +- 13 files changed, 5510 insertions(+), 3156 deletions(-) create mode 100644 components/oss/ceph/option.go create mode 100644 components/oss/ceph/option_test.go create mode 100644 components/oss/ceph/oss.go create mode 100644 components/oss/ceph/oss_test.go diff --git a/.gitignore b/.gitignore index 1cf3674b3d..3cba1002e3 100644 --- a/.gitignore +++ b/.gitignore @@ -54,6 +54,7 @@ cmd/layotto_multiple_api/nohup.out default.etcd/ demo/configuration/common/client demo/file/client +demo/oss/client demo/flowcontrol/client demo/lock/redis/client demo/pubsub/redis/client/publisher diff --git a/cmd/layotto/main.go b/cmd/layotto/main.go index cf320b3cd1..9b13036802 100644 --- a/cmd/layotto/main.go +++ b/cmd/layotto/main.go @@ -28,6 +28,8 @@ import ( aliyun_oss "mosn.io/layotto/components/oss/aliyun" + ceph_oss "mosn.io/layotto/components/oss/ceph" + "mosn.io/mosn/pkg/istio" aliyun_file "mosn.io/layotto/components/file/aliyun" @@ -287,6 +289,7 @@ func NewRuntimeGrpcServer(data json.RawMessage, opts ...grpc.ServerOption) (mgrp runtime.WithOssFactory( oss.NewFactory("aws.oss", aws_oss.NewAwsOss), oss.NewFactory("aliyun.oss", aliyun_oss.NewAliyunOss), + oss.NewFactory("ceph.oss", ceph_oss.NewCephOss), ), // PubSub runtime.WithPubSubFactory( diff --git a/cmd/layotto_multiple_api/main.go b/cmd/layotto_multiple_api/main.go index 20d02dfa9a..91e0d600df 100644 --- a/cmd/layotto_multiple_api/main.go +++ b/cmd/layotto_multiple_api/main.go @@ -28,6 +28,8 @@ import ( aliyun_oss "mosn.io/layotto/components/oss/aliyun" + ceph_oss "mosn.io/layotto/components/oss/ceph" + aliyun_file "mosn.io/layotto/components/file/aliyun" "mosn.io/layotto/components/file/local" @@ -299,6 +301,7 @@ func NewRuntimeGrpcServer(data json.RawMessage, opts ...grpc.ServerOption) (mgrp runtime.WithOssFactory( oss.NewFactory("aws.oss", aws_oss.NewAwsOss), oss.NewFactory("aliyun.oss", aliyun_oss.NewAliyunOss), + oss.NewFactory("ceph.oss", ceph_oss.NewCephOss), ), // PubSub diff --git a/cmd/layotto_without_xds/main.go b/cmd/layotto_without_xds/main.go index 243e177fc4..6ae277b287 100644 --- a/cmd/layotto_without_xds/main.go +++ b/cmd/layotto_without_xds/main.go @@ -28,6 +28,8 @@ import ( aliyun_oss "mosn.io/layotto/components/oss/aliyun" + ceph_oss "mosn.io/layotto/components/oss/ceph" + "mosn.io/layotto/components/file/aliyun" aws_file "mosn.io/layotto/components/file/aws" "mosn.io/layotto/components/file/minio" @@ -403,6 +405,7 @@ func NewRuntimeGrpcServer(data json.RawMessage, opts ...grpc.ServerOption) (mgrp runtime.WithOssFactory( oss.NewFactory("aws.oss", aws_oss.NewAwsOss), oss.NewFactory("aliyun.oss", aliyun_oss.NewAliyunOss), + oss.NewFactory("ceph.oss", ceph_oss.NewCephOss), ), // Sequencer diff --git a/components/oss/ceph/option.go b/components/oss/ceph/option.go new file mode 100644 index 0000000000..c97cffb309 --- /dev/null +++ b/components/oss/ceph/option.go @@ -0,0 +1,43 @@ +/* +* Copyright 2021 Layotto Authors +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. + */ + +package ceph + +import ( + "time" + + "github.com/jinzhu/copier" +) + +var ( + int642time = copier.TypeConverter{ + SrcType: int64(0), + DstType: &time.Time{}, + Fn: func(src interface{}) (interface{}, error) { + s, _ := src.(int64) + t := time.Unix(s, 0) + return &t, nil + }, + } + time2int64 = copier.TypeConverter{ + SrcType: &time.Time{}, + DstType: int64(0), + Fn: func(src interface{}) (interface{}, error) { + s, _ := src.(*time.Time) + return s.Unix(), nil + }, + } +) diff --git a/components/oss/ceph/option_test.go b/components/oss/ceph/option_test.go new file mode 100644 index 0000000000..d2a2c39652 --- /dev/null +++ b/components/oss/ceph/option_test.go @@ -0,0 +1,52 @@ +/* +* Copyright 2021 Layotto Authors +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. + */ + +package ceph + +import ( + "testing" + "time" + + "github.com/stretchr/testify/assert" + + "github.com/jinzhu/copier" +) + +func TestCopierOption(t *testing.T) { + type ValueWithInt64 struct { + TestString string + TestInt64toTime int64 + } + + type ValueWithTimer struct { + TestString *string + TestInt64toTime *time.Time + } + timer := time.Now().Unix() + srcValue := &ValueWithInt64{TestInt64toTime: timer} + destValue := &ValueWithTimer{} + err := copier.CopyWithOption(destValue, srcValue, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{int642time}}) + assert.Nil(t, err) + assert.Nil(t, destValue.TestString) + assert.Equal(t, timer, destValue.TestInt64toTime.Unix()) + + ti := time.Now() + src := &ValueWithTimer{TestInt64toTime: &ti} + dst := &ValueWithInt64{} + err = copier.CopyWithOption(dst, src, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{time2int64}}) + assert.Nil(t, err) + assert.Equal(t, ti.Unix(), dst.TestInt64toTime) +} diff --git a/components/oss/ceph/oss.go b/components/oss/ceph/oss.go new file mode 100644 index 0000000000..da71977100 --- /dev/null +++ b/components/oss/ceph/oss.go @@ -0,0 +1,649 @@ +/* +* Copyright 2021 Layotto Authors +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. + */ + +package ceph + +import ( + "bytes" + "context" + "encoding/json" + "errors" + "fmt" + "strings" + "time" + + "github.com/aws/aws-sdk-go-v2/aws" + v4 "github.com/aws/aws-sdk-go-v2/aws/signer/v4" + aws_config "github.com/aws/aws-sdk-go-v2/config" + "github.com/aws/aws-sdk-go-v2/credentials" + "github.com/aws/aws-sdk-go-v2/feature/s3/manager" + "github.com/aws/aws-sdk-go-v2/service/s3" + "github.com/aws/aws-sdk-go-v2/service/s3/types" + "github.com/jinzhu/copier" + "mosn.io/pkg/log" + + "mosn.io/layotto/components/oss" + "mosn.io/layotto/components/pkg/utils" +) + +type CephOss struct { + client *s3.Client + basicConf json.RawMessage +} + +func NewCephOss() oss.Oss { + return &CephOss{} +} + +func (c *CephOss) Init(ctx context.Context, config *oss.Config) error { + c.basicConf = config.Metadata[oss.BasicConfiguration] + m := &utils.OssMetadata{} + err := json.Unmarshal(c.basicConf, &m) + if err != nil { + return oss.ErrInvalid + } + + customResolver := aws.EndpointResolverWithOptionsFunc(func(service, region string, options ...interface{}) (aws.Endpoint, error) { + return aws.Endpoint{ + URL: m.Endpoint, + }, nil + }) + optFunc := []func(options *aws_config.LoadOptions) error{ + aws_config.WithRegion(m.Region), + aws_config.WithCredentialsProvider(credentials.StaticCredentialsProvider{ + Value: aws.Credentials{ + AccessKeyID: m.AccessKeyID, SecretAccessKey: m.AccessKeySecret, + Source: "provider", + }, + }), + aws_config.WithEndpointResolverWithOptions(customResolver), + } + cfg, err := aws_config.LoadDefaultConfig(context.TODO(), optFunc...) + if err != nil { + return err + } + client := s3.NewFromConfig(cfg, func(options *s3.Options) { + options.UsePathStyle = true + }) + c.client = client + return nil +} + +func (c *CephOss) GetObject(ctx context.Context, req *oss.GetObjectInput) (*oss.GetObjectOutput, error) { + client, err := c.getClient() + if err != nil { + return nil, err + } + + input := &s3.GetObjectInput{} + err = copier.CopyWithOption(input, req, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{}}) + if err != nil { + return nil, err + } + ob, err := client.GetObject(context.TODO(), input) + if err != nil { + return nil, err + } + + out := &oss.GetObjectOutput{} + err = copier.Copy(out, ob) + if err != nil { + return nil, err + } + out.DataStream = ob.Body + return out, nil +} + +func (c *CephOss) PutObject(ctx context.Context, req *oss.PutObjectInput) (*oss.PutObjectOutput, error) { + client, err := c.getClient() + if err != nil { + return nil, err + } + + input := &s3.PutObjectInput{} + err = copier.CopyWithOption(input, req, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{}}) + if err != nil { + return nil, err + } + input.Body = req.DataStream + uploader := manager.NewUploader(client) + resp, err := uploader.Upload(context.TODO(), input) + if err != nil { + return nil, err + } + + out := &oss.PutObjectOutput{} + err = copier.Copy(out, resp) + if err != nil { + return nil, err + } + return out, err +} + +func (c *CephOss) DeleteObject(ctx context.Context, req *oss.DeleteObjectInput) (*oss.DeleteObjectOutput, error) { + client, err := c.getClient() + if err != nil { + return nil, err + } + + input := &s3.DeleteObjectInput{ + Bucket: &req.Bucket, + Key: &req.Key, + } + resp, err := client.DeleteObject(ctx, input) + if err != nil { + return nil, err + } + + versionId := "" + if resp.VersionId != nil { + versionId = *resp.VersionId + } + return &oss.DeleteObjectOutput{DeleteMarker: resp.DeleteMarker, RequestCharged: string(resp.RequestCharged), VersionId: versionId}, err +} + +func (c *CephOss) PutObjectTagging(ctx context.Context, req *oss.PutObjectTaggingInput) (*oss.PutObjectTaggingOutput, error) { + client, err := c.getClient() + if err != nil { + return nil, err + } + + input := &s3.PutObjectTaggingInput{Tagging: &types.Tagging{}} + err = copier.CopyWithOption(input, req, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{}}) + if err != nil { + return nil, err + } + for k, v := range req.Tags { + k, v := k, v + input.Tagging.TagSet = append(input.Tagging.TagSet, types.Tag{Key: &k, Value: &v}) + } + _, err = client.PutObjectTagging(ctx, input) + + return &oss.PutObjectTaggingOutput{}, err +} + +func (c *CephOss) DeleteObjectTagging(ctx context.Context, req *oss.DeleteObjectTaggingInput) (*oss.DeleteObjectTaggingOutput, error) { + client, err := c.getClient() + if err != nil { + return nil, err + } + + input := &s3.DeleteObjectTaggingInput{} + err = copier.CopyWithOption(input, req, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{}}) + if err != nil { + return nil, err + } + resp, err := client.DeleteObjectTagging(ctx, input) + if err != nil { + return nil, err + } + + versionId := "" + if resp.VersionId != nil { + versionId = *resp.VersionId + } + return &oss.DeleteObjectTaggingOutput{VersionId: versionId}, err +} + +func (c *CephOss) GetObjectTagging(ctx context.Context, req *oss.GetObjectTaggingInput) (*oss.GetObjectTaggingOutput, error) { + client, err := c.getClient() + if err != nil { + return nil, err + } + + input := &s3.GetObjectTaggingInput{} + err = copier.CopyWithOption(input, req, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{}}) + if err != nil { + return nil, err + } + resp, err := client.GetObjectTagging(ctx, input) + if err != nil { + return nil, err + } + + output := &oss.GetObjectTaggingOutput{Tags: map[string]string{}} + for _, tags := range resp.TagSet { + output.Tags[*tags.Key] = *tags.Value + } + return output, err +} + +func (c *CephOss) CopyObject(ctx context.Context, req *oss.CopyObjectInput) (*oss.CopyObjectOutput, error) { + client, err := c.getClient() + if err != nil { + return nil, err + } + + if req.CopySource == nil { + return nil, errors.New("must specific copy_source") + } + + input := &s3.CopyObjectInput{} + err = copier.CopyWithOption(input, req, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{int642time}}) + if err != nil { + return nil, err + } + copySource := req.CopySource.CopySourceBucket + "/" + req.CopySource.CopySourceKey + if req.CopySource.CopySourceVersionId != "" { + copySource += "?versionId=" + req.CopySource.CopySourceVersionId + } + input.CopySource = ©Source + resp, err := client.CopyObject(context.TODO(), input) + if err != nil { + return nil, err + } + + out := &oss.CopyObjectOutput{} + err = copier.CopyWithOption(out, resp, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{}}) + if err != nil { + return nil, err + } + return out, err +} + +func (c *CephOss) DeleteObjects(ctx context.Context, req *oss.DeleteObjectsInput) (*oss.DeleteObjectsOutput, error) { + client, err := c.getClient() + if err != nil { + return nil, err + } + + input := &s3.DeleteObjectsInput{ + Bucket: &req.Bucket, + Delete: &types.Delete{}, + } + if req.Delete != nil { + for _, v := range req.Delete.Objects { + object := &types.ObjectIdentifier{} + err = copier.CopyWithOption(object, v, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{}}) + if err != nil { + return nil, err + } + input.Delete.Objects = append(input.Delete.Objects, *object) + } + } + resp, err := client.DeleteObjects(ctx, input) + if err != nil { + return nil, err + } + + output := &oss.DeleteObjectsOutput{} + copier.Copy(output, resp) + return output, err +} + +func (c *CephOss) ListObjects(ctx context.Context, req *oss.ListObjectsInput) (*oss.ListObjectsOutput, error) { + client, err := c.getClient() + if err != nil { + return nil, err + } + + input := &s3.ListObjectsInput{} + err = copier.CopyWithOption(input, req, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{}}) + if err != nil { + return nil, err + } + resp, err := client.ListObjects(ctx, input) + if err != nil { + return nil, err + } + + output := &oss.ListObjectsOutput{} + err = copier.CopyWithOption(output, resp, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{time2int64}}) + // if not return NextMarker, use the value of the last Key in the response as the marker + if output.IsTruncated && output.NextMarker == "" { + index := len(output.Contents) - 1 + output.NextMarker = output.Contents[index].Key + } + return output, err +} + +func (c *CephOss) GetObjectCannedAcl(ctx context.Context, req *oss.GetObjectCannedAclInput) (*oss.GetObjectCannedAclOutput, error) { + client, err := c.getClient() + if err != nil { + return nil, err + } + + input := &s3.GetObjectAclInput{} + err = copier.CopyWithOption(input, req, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{}}) + if err != nil { + return nil, err + } + resp, err := client.GetObjectAcl(context.TODO(), input) + if err != nil { + return nil, err + } + + out := &oss.GetObjectCannedAclOutput{} + err = copier.CopyWithOption(out, resp, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{}}) + if err != nil { + return nil, err + } + bs, _ := json.Marshal(resp.Grants) + var bf bytes.Buffer + err = json.Indent(&bf, bs, "", "\t") + if err != nil { + return nil, err + } + out.CannedAcl = bf.String() + return out, nil +} + +func (c *CephOss) PutObjectCannedAcl(ctx context.Context, req *oss.PutObjectCannedAclInput) (*oss.PutObjectCannedAclOutput, error) { + client, err := c.getClient() + if err != nil { + return nil, err + } + input := &s3.PutObjectAclInput{Bucket: &req.Bucket, Key: &req.Key, ACL: types.ObjectCannedACL(req.Acl)} + resp, err := client.PutObjectAcl(ctx, input) + if err != nil { + return nil, err + } + return &oss.PutObjectCannedAclOutput{RequestCharged: string(resp.RequestCharged)}, err +} + + +func (c *CephOss) CreateMultipartUpload(ctx context.Context, req *oss.CreateMultipartUploadInput) (*oss.CreateMultipartUploadOutput, error) { + client, err := c.getClient() + if err != nil { + return nil, err + } + + input := &s3.CreateMultipartUploadInput{} + err = copier.CopyWithOption(input, req, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{int642time}}) + if err != nil { + log.DefaultLogger.Errorf("copy CreateMultipartUploadInput fail, err: %+v", err) + return nil, err + } + resp, err := client.CreateMultipartUpload(ctx, input) + if err != nil { + return nil, err + } + + output := &oss.CreateMultipartUploadOutput{} + copier.CopyWithOption(output, resp, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{time2int64}}) + return output, err +} + +func (c *CephOss) UploadPart(ctx context.Context, req *oss.UploadPartInput) (*oss.UploadPartOutput, error) { + client, err := c.getClient() + if err != nil { + return nil, err + } + + input := &s3.UploadPartInput{} + err = copier.CopyWithOption(input, req, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{}}) + if err != nil { + return nil, err + } + input.Body = req.DataStream + resp, err := client.UploadPart(ctx, input, s3.WithAPIOptions(v4.SwapComputePayloadSHA256ForUnsignedPayloadMiddleware)) + if err != nil { + return nil, err + } + + output := &oss.UploadPartOutput{} + err = copier.Copy(output, resp) + if err != nil { + return nil, err + } + return output, err +} + +func (c *CephOss) UploadPartCopy(ctx context.Context, req *oss.UploadPartCopyInput) (*oss.UploadPartCopyOutput, error) { + client, err := c.getClient() + if err != nil { + return nil, err + } + + input := &s3.UploadPartCopyInput{} + err = copier.CopyWithOption(input, req, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{}}) + if err != nil { + return nil, err + } + copySource := req.CopySource.CopySourceBucket + "/" + req.CopySource.CopySourceKey + if req.CopySource.CopySourceVersionId != "" { + copySource += "?versionId=" + req.CopySource.CopySourceVersionId + } + input.CopySource = ©Source + resp, err := client.UploadPartCopy(context.TODO(), input) + if err != nil { + return nil, err + } + + out := &oss.UploadPartCopyOutput{} + err = copier.CopyWithOption(out, resp, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{}}) + if err != nil { + return nil, err + } + return out, err +} + +func (c *CephOss) CompleteMultipartUpload(ctx context.Context, req *oss.CompleteMultipartUploadInput) (*oss.CompleteMultipartUploadOutput, error) { + client, err := c.getClient() + if err != nil { + return nil, err + } + + input := &s3.CompleteMultipartUploadInput{MultipartUpload: &types.CompletedMultipartUpload{}} + err = copier.CopyWithOption(input, req, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{}}) + if err != nil { + return nil, err + } + resp, err := client.CompleteMultipartUpload(ctx, input) + if err != nil { + return nil, err + } + + output := &oss.CompleteMultipartUploadOutput{} + err = copier.Copy(output, resp) + return output, err +} + +func (c *CephOss) AbortMultipartUpload(ctx context.Context, req *oss.AbortMultipartUploadInput) (*oss.AbortMultipartUploadOutput, error) { + client, err := c.getClient() + if err != nil { + return nil, err + } + + input := &s3.AbortMultipartUploadInput{} + err = copier.CopyWithOption(input, req, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{}}) + if err != nil { + return nil, err + } + resp, err := client.AbortMultipartUpload(ctx, input) + if err != nil { + return nil, err + } + + output := &oss.AbortMultipartUploadOutput{ + RequestCharged: string(resp.RequestCharged), + } + return output, err +} + +func (c *CephOss) ListParts(ctx context.Context, req *oss.ListPartsInput) (*oss.ListPartsOutput, error) { + client, err := c.getClient() + if err != nil { + return nil, err + } + + input := &s3.ListPartsInput{} + err = copier.CopyWithOption(input, req, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{}}) + if err != nil { + return nil, err + } + resp, err := client.ListParts(ctx, input) + if err != nil { + return nil, err + } + + output := &oss.ListPartsOutput{} + err = copier.CopyWithOption(output, resp, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{}}) + if err != nil { + return nil, err + } + return output, err +} + +func (c *CephOss) ListMultipartUploads(ctx context.Context, req *oss.ListMultipartUploadsInput) (*oss.ListMultipartUploadsOutput, error) { + client, err := c.getClient() + if err != nil { + return nil, err + } + + input := &s3.ListMultipartUploadsInput{} + err = copier.CopyWithOption(input, req, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{}}) + if err != nil { + return nil, err + } + resp, err := client.ListMultipartUploads(ctx, input) + if err != nil { + return nil, err + } + + output := &oss.ListMultipartUploadsOutput{CommonPrefixes: []string{}, Uploads: []*oss.MultipartUpload{}} + err = copier.Copy(output, resp) + if err != nil { + return nil, err + } + for _, v := range resp.CommonPrefixes { + output.CommonPrefixes = append(output.CommonPrefixes, *v.Prefix) + } + for _, v := range resp.Uploads { + upload := &oss.MultipartUpload{} + copier.CopyWithOption(upload, v, copier.Option{IgnoreEmpty: true, DeepCopy: true}) + output.Uploads = append(output.Uploads, upload) + } + return output, err +} + +func (c *CephOss) ListObjectVersions(ctx context.Context, req *oss.ListObjectVersionsInput) (*oss.ListObjectVersionsOutput, error) { + client, err := c.getClient() + if err != nil { + return nil, err + } + + input := &s3.ListObjectVersionsInput{} + err = copier.CopyWithOption(input, req, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{}}) + if err != nil { + return nil, err + } + resp, err := client.ListObjectVersions(ctx, input) + if err != nil { + return nil, err + } + + output := &oss.ListObjectVersionsOutput{} + err = copier.Copy(output, resp) + if err != nil { + return nil, err + } + for _, v := range resp.CommonPrefixes { + output.CommonPrefixes = append(output.CommonPrefixes, *v.Prefix) + } + for _, v := range resp.DeleteMarkers { + entry := &oss.DeleteMarkerEntry{IsLatest: v.IsLatest, Key: *v.Key, Owner: &oss.Owner{DisplayName: *v.Owner.DisplayName, ID: *v.Owner.ID}, VersionId: *v.VersionId} + output.DeleteMarkers = append(output.DeleteMarkers, entry) + } + for _, v := range resp.Versions { + version := &oss.ObjectVersion{} + copier.CopyWithOption(version, v, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{time2int64}}) + output.Versions = append(output.Versions, version) + } + return output, err +} + +func (c *CephOss) HeadObject(ctx context.Context, req *oss.HeadObjectInput) (*oss.HeadObjectOutput, error) { + client, err := c.getClient() + if err != nil { + return nil, err + } + input := &s3.HeadObjectInput{} + err = copier.CopyWithOption(input, req, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{}}) + if err != nil { + return nil, err + } + resp, err := client.HeadObject(ctx, input) + if err != nil { + return nil, err + } + return &oss.HeadObjectOutput{ResultMetadata: resp.Metadata}, nil +} + +func (c *CephOss) IsObjectExist(ctx context.Context, req *oss.IsObjectExistInput) (*oss.IsObjectExistOutput, error) { + client, err := c.getClient() + if err != nil { + return nil, err + } + input := &s3.HeadObjectInput{Bucket: &req.Bucket, Key: &req.Key} + _, err = client.HeadObject(ctx, input) + if err != nil { + errorMsg := err.Error() + if strings.Contains(errorMsg, "StatusCode: 404") { + return &oss.IsObjectExistOutput{FileExist: false}, nil + } + return nil, err + } + return &oss.IsObjectExistOutput{FileExist: true}, nil +} + +func (c *CephOss) SignURL(ctx context.Context, req *oss.SignURLInput) (*oss.SignURLOutput, error) { + client, err := c.getClient() + if err != nil { + return nil, err + } + resignClient := s3.NewPresignClient(client) + switch strings.ToUpper(req.Method) { + case "GET": + input := &s3.GetObjectInput{Bucket: &req.Bucket, Key: &req.Key} + resp, err := resignClient.PresignGetObject(ctx, input, s3.WithPresignExpires(time.Duration((req.ExpiredInSec)*int64(time.Second)))) + if err != nil { + return nil, err + } + return &oss.SignURLOutput{SignedUrl: resp.URL}, nil + case "PUT": + input := &s3.PutObjectInput{Bucket: &req.Bucket, Key: &req.Key} + resp, err := resignClient.PresignPutObject(ctx, input, s3.WithPresignExpires(time.Duration(req.ExpiredInSec*int64(time.Second)))) + if err != nil { + return nil, err + } + return &oss.SignURLOutput{SignedUrl: resp.URL}, nil + default: + return nil, fmt.Errorf("not supported method %+v now", req.Method) + } +} + +func (c *CephOss) RestoreObject(ctx context.Context, req *oss.RestoreObjectInput) (*oss.RestoreObjectOutput, error) { + return nil, errors.New("RestoreObject method not supported on AWS") +} + +func (c *CephOss) UpdateDownloadBandwidthRateLimit(ctx context.Context, req *oss.UpdateBandwidthRateLimitInput) error { + return errors.New("UpdateDownloadBandwidthRateLimit method not supported now") +} + +func (c *CephOss) UpdateUploadBandwidthRateLimit(ctx context.Context, req *oss.UpdateBandwidthRateLimitInput) error { + return errors.New("UpdateUploadBandwidthRateLimit method not supported now") +} +func (c *CephOss) AppendObject(ctx context.Context, req *oss.AppendObjectInput) (*oss.AppendObjectOutput, error) { + return nil, errors.New("AppendObject method not supported on AWS") +} + +func (c *CephOss) getClient() (*s3.Client, error) { + if c.client == nil { + return nil, utils.ErrNotInitClient + } + return c.client, nil +} diff --git a/components/oss/ceph/oss_test.go b/components/oss/ceph/oss_test.go new file mode 100644 index 0000000000..e660785836 --- /dev/null +++ b/components/oss/ceph/oss_test.go @@ -0,0 +1,535 @@ +/* +* Copyright 2021 Layotto Authors +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. + */ + +package ceph + +import ( + "bytes" + "context" + "encoding/json" + "errors" + "fmt" + "io" + "io/ioutil" + "log" + "os" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "mosn.io/pkg/buffer" + + "mosn.io/layotto/components/oss" +) + +const ( + confWithoutUidAndBucket = ` + { + "endpoint": "http://10.211.55.13:7480", + "accessKeyID": "QRF1XGIPZ9TB094ETTWU", + "accessKeySecret": "6gF61QLVduFIFDKPBzc6gKkOsQY2HpAt7vM5mRAA" + } + ` +) + +func TestCephDefaultInitFunc(t *testing.T) { + a := &CephOss{} + err := a.Init(context.TODO(), &oss.Config{Metadata: map[string]json.RawMessage{oss.BasicConfiguration: []byte("hello")}}) + assert.Equal(t, err, oss.ErrInvalid) + assert.Nil(t, a.client) +} + +func TestCephOss_GetObject(t *testing.T) { + cephOss := NewCephOss() + err := cephOss.Init(context.TODO(), &oss.Config{Metadata: map[string]json.RawMessage{oss.BasicConfiguration: []byte(confWithoutUidAndBucket)}}) + assert.Nil(t, err) + + req := &oss.GetObjectInput{ + Bucket: "test.bucket", + Key: "TestPut.txt", + } + out, err := cephOss.GetObject(context.Background(), req) + assert.Nil(t, err) + + data, err := ioutil.ReadAll(out.DataStream) + assert.Nil(t, err) + fmt.Println(string(data)) +} + +func TestCephOss_PutObject(t *testing.T) { + cephOss := NewCephOss() + err := cephOss.Init(context.TODO(), &oss.Config{Metadata: map[string]json.RawMessage{oss.BasicConfiguration: []byte(confWithoutUidAndBucket)}}) + assert.Nil(t, err) + + reader, err := os.Open("/Users/apple/Desktop/untitled 3.txt") + assert.Nil(t, err) + req := &oss.PutObjectInput{ + DataStream: reader, + Bucket: "test.bucket", + Key: "TestPut.txt", + } + + out, err := cephOss.PutObject(context.Background(), req) + assert.Nil(t, err) + printOutput(out) +} + +func TestCephOss_DeleteObject(t *testing.T) { + cephOss := NewCephOss() + err := cephOss.Init(context.TODO(), &oss.Config{Metadata: map[string]json.RawMessage{oss.BasicConfiguration: []byte(confWithoutUidAndBucket)}}) + assert.Nil(t, err) + + req := &oss.DeleteObjectInput{ + Bucket: "test.bucket", + Key: "TestPut.txt", + } + + out, err := cephOss.DeleteObject(context.Background(), req) + assert.Nil(t, err) + printOutput(out) +} + +func TestCephOss_DeleteObjects(t *testing.T) { + cephOss := NewCephOss() + err := cephOss.Init(context.TODO(), &oss.Config{Metadata: map[string]json.RawMessage{oss.BasicConfiguration: []byte(confWithoutUidAndBucket)}}) + assert.Nil(t, err) + + d := &oss.Delete{ + Objects: []*oss.ObjectIdentifier{ + {Key: "TestPut.txt"}, + {Key: "a.txt"}, + }, + } + req := &oss.DeleteObjectsInput{ + Bucket: "test.bucket", + Delete: d, + } + out, err := cephOss.DeleteObjects(context.Background(), req) + assert.Nil(t, err) + printOutput(out) +} + +func TestCephOss_ListObjects(t *testing.T) { + cephOss := NewCephOss() + err := cephOss.Init(context.TODO(), &oss.Config{Metadata: map[string]json.RawMessage{oss.BasicConfiguration: []byte(confWithoutUidAndBucket)}}) + assert.Nil(t, err) + + req := &oss.ListObjectsInput{ + Bucket: "test.bucket", + } + + out, err := cephOss.ListObjects(context.Background(), req) + assert.Nil(t, err) + printOutput(out) +} + +func TestCephOss_PutObjectTagging(t *testing.T) { + cephOss := NewCephOss() + err := cephOss.Init(context.TODO(), &oss.Config{Metadata: map[string]json.RawMessage{oss.BasicConfiguration: []byte(confWithoutUidAndBucket)}}) + assert.Nil(t, err) + + tags := map[string]string{ + "Test": "True", + "HAHA": "haha", + } + req := &oss.PutObjectTaggingInput{ + Bucket: "test.bucket", + Key: "TestPut.txt", + Tags: tags, + } + + out, err := cephOss.PutObjectTagging(context.Background(), req) + assert.Nil(t, err) + printOutput(out) +} + +func TestCephOss_GetObjectTagging(t *testing.T) { + cephOss := NewCephOss() + err := cephOss.Init(context.TODO(), &oss.Config{Metadata: map[string]json.RawMessage{oss.BasicConfiguration: []byte(confWithoutUidAndBucket)}}) + assert.Nil(t, err) + + req := &oss.GetObjectTaggingInput{ + Bucket: "test.bucket", + Key: "TestPut.txt", + } + + out, err := cephOss.GetObjectTagging(context.Background(), req) + assert.Nil(t, err) + printOutput(out) +} + +func TestCephOss_DeleteObjectTagging(t *testing.T) { + cephOss := NewCephOss() + err := cephOss.Init(context.TODO(), &oss.Config{Metadata: map[string]json.RawMessage{oss.BasicConfiguration: []byte(confWithoutUidAndBucket)}}) + assert.Nil(t, err) + + req := &oss.DeleteObjectTaggingInput{ + Bucket: "test.bucket", + Key: "TestPut.txt", + } + + out, err := cephOss.DeleteObjectTagging(context.Background(), req) + assert.Nil(t, err) + printOutput(out) +} + +func TestCephOss_CopyObject(t *testing.T) { + cephOss := NewCephOss() + err := cephOss.Init(context.TODO(), &oss.Config{Metadata: map[string]json.RawMessage{oss.BasicConfiguration: []byte(confWithoutUidAndBucket)}}) + assert.Nil(t, err) + + source := oss.CopySource{ + CopySourceBucket: "test.bucket", + CopySourceKey: "haha.txt", + } + req := &oss.CopyObjectInput{ + Bucket: "test.bucket", + Key: "b.txt", + CopySource: &source, + } + + out, err := cephOss.CopyObject(context.Background(), req) + assert.Nil(t, err) + printOutput(out) +} + +func TestCephOss_PutObjectCannedAcl(t *testing.T) { + cephOss := NewCephOss() + err := cephOss.Init(context.TODO(), &oss.Config{Metadata: map[string]json.RawMessage{oss.BasicConfiguration: []byte(confWithoutUidAndBucket)}}) + assert.Nil(t, err) + + req := &oss.PutObjectCannedAclInput{ + Bucket: "test.bucket", + Key: "TestPut.txt", + Acl: "private", + } + + out, err := cephOss.PutObjectCannedAcl(context.Background(), req) + assert.Nil(t, err) + printOutput(out) +} + +func TestCephOss_GetObjectCannedAcl(t *testing.T) { + cephOss := NewCephOss() + err := cephOss.Init(context.TODO(), &oss.Config{Metadata: map[string]json.RawMessage{oss.BasicConfiguration: []byte(confWithoutUidAndBucket)}}) + assert.Nil(t, err) + + req := &oss.GetObjectCannedAclInput{ + Bucket: "test.bucket", + Key: "TestPut.txt", + } + + out, err := cephOss.GetObjectCannedAcl(context.Background(), req) + assert.Nil(t, err) + fmt.Printf("%+v\n", out) +} + +func TestCephOss_MultipartUploadWithAbort(t *testing.T) { + cephOss := NewCephOss() + err := cephOss.Init(context.TODO(), &oss.Config{Metadata: map[string]json.RawMessage{oss.BasicConfiguration: []byte(confWithoutUidAndBucket)}}) + assert.Nil(t, err) + + key := "TestMultipartUploadWithAbort" + uploadId := createMultipartUpload(t, cephOss, key) + + f, err := os.Open("/Users/apple/Downloads/TestMultipartUpload.zip") + assert.Nil(t, err) + uploadPart(t, cephOss, key, uploadId, 1, f) + + abortMultipartUpload(t, cephOss, key, uploadId) +} + +func TestCephOss_MultipartUploadWithComplete(t *testing.T) { + cephOss := NewCephOss() + err := cephOss.Init(context.TODO(), &oss.Config{Metadata: map[string]json.RawMessage{oss.BasicConfiguration: []byte(confWithoutUidAndBucket)}}) + assert.Nil(t, err) + + key := "TestMultipartUploadWithComplete" + uploadId := createMultipartUpload(t, cephOss, key) + f, err := os.Open("/Users/apple/Downloads/TestMultipartUpload.zip") + assert.Nil(t, err) + go listMultipartUploads(t, cephOss) + eTag := uploadPart(t, cephOss, key, uploadId, 1, f) + listParts(t, cephOss, key, uploadId) + + completeMultipartUpload(t, cephOss, key, uploadId, eTag, 1) +} + +func TestCephOss_UploadPartCopy(t *testing.T) { + cephOss := NewCephOss() + err := cephOss.Init(context.TODO(), &oss.Config{Metadata: map[string]json.RawMessage{oss.BasicConfiguration: []byte(confWithoutUidAndBucket)}}) + assert.Nil(t, err) + + key := "TestUploadPartCopy" + uploadId := createMultipartUpload(t, cephOss, key) + assert.Nil(t, err) + eTag := uploadPartCopy(t, cephOss, uploadId, 1) + + completeMultipartUpload(t, cephOss, key, uploadId, eTag, 1) +} + +func TestCephOss_ListObjectVersions(t *testing.T) { + cephOss := NewCephOss() + err := cephOss.Init(context.TODO(), &oss.Config{Metadata: map[string]json.RawMessage{oss.BasicConfiguration: []byte(confWithoutUidAndBucket)}}) + assert.Nil(t, err) + + req := &oss.ListObjectVersionsInput{ + Bucket: "test.bucket", + } + + out, err := cephOss.ListObjectVersions(context.Background(), req) + assert.Nil(t, err) + printOutput(out) +} + +func TestCephOss_HeadObject(t *testing.T) { + cephOss := NewCephOss() + err := cephOss.Init(context.TODO(), &oss.Config{Metadata: map[string]json.RawMessage{oss.BasicConfiguration: []byte(confWithoutUidAndBucket)}}) + assert.Nil(t, err) + + req := &oss.HeadObjectInput{ + Bucket: "test.bucket", + Key: "TestPut.txt", + } + + out, err := cephOss.HeadObject(context.Background(), req) + assert.Nil(t, err) + printOutput(out) +} + +func TestCephOss_IsObjectExist(t *testing.T) { + cephOss := NewCephOss() + err := cephOss.Init(context.TODO(), &oss.Config{Metadata: map[string]json.RawMessage{oss.BasicConfiguration: []byte(confWithoutUidAndBucket)}}) + assert.Nil(t, err) + + req := &oss.IsObjectExistInput{ + Bucket: "test.bucket", + Key: "a.txt", + } + + out, err := cephOss.IsObjectExist(context.Background(), req) + assert.Nil(t, err) + printOutput(out) +} + +func TestCephOss_SignURL(t *testing.T) { + cephOss := NewCephOss() + err := cephOss.Init(context.TODO(), &oss.Config{Metadata: map[string]json.RawMessage{oss.BasicConfiguration: []byte(confWithoutUidAndBucket)}}) + assert.Nil(t, err) + + req := &oss.SignURLInput{ + Bucket: "test.bucket", + Key: "TestPut.txt", + Method: "Get", + } + + out, err := cephOss.SignURL(context.Background(), req) + assert.Nil(t, err) + printOutput(out) +} + +func createMultipartUpload(t *testing.T, cephOss oss.Oss, key string) (uploadId string) { + fmt.Println("=====[CreateMultipartUpload]") + req := &oss.CreateMultipartUploadInput{ + Bucket: "test.bucket", + Key: key, + } + out, err := cephOss.CreateMultipartUpload(context.Background(), req) + assert.Nil(t, err) + printOutput(out) + return out.UploadId +} +func uploadPart(t *testing.T, cephOss oss.Oss, key string, uploadId string, partNumber int32, dataStream io.Reader) (etag string) { + assert.True(t, (1 <= partNumber) && (partNumber <= 10000)) + req := &oss.UploadPartInput{ + Bucket: "test.bucket", + Key: key, + UploadId: uploadId, + PartNumber: partNumber, + DataStream: dataStream, + } + out, err := cephOss.UploadPart(context.Background(), req) + assert.Nil(t, err) + fmt.Printf("=====[UploadPart %d]\n", partNumber) + printOutput(out) + return out.ETag +} +func uploadPartCopy(t *testing.T, cephOss oss.Oss, uploadId string, partNumber int32) (etag string) { + assert.True(t, (1 <= partNumber) && (partNumber <= 10000)) + copySource := oss.CopySource{ + CopySourceBucket: "test.bucket", + CopySourceKey: "TestMultipartUpload", + } + req := &oss.UploadPartCopyInput{ + Bucket: "test.bucket", + Key: "TestUploadPartCopy", + UploadId: uploadId, + PartNumber: partNumber, + CopySource: ©Source, + } + out, err := cephOss.UploadPartCopy(context.Background(), req) + assert.Nil(t, err) + fmt.Printf("=====[UploadPartCopy %d]\n", partNumber) + printOutput(out) + return out.CopyPartResult.ETag +} +func abortMultipartUpload(t *testing.T, cephOss oss.Oss, key string, uploadId string) { + fmt.Println("=====[AbortMultipartUpload]") + req := &oss.AbortMultipartUploadInput{ + Bucket: "test.bucket", + Key: key, + UploadId: uploadId, + } + out, err := cephOss.AbortMultipartUpload(context.Background(), req) + assert.Nil(t, err) + printOutput(out) +} +func completeMultipartUpload(t *testing.T, cephOss oss.Oss, key string, uploadId string, eTag string, partNumber int32) { + fmt.Println("=====[CompleteMultipartUpload]") + multipartUpload := &oss.CompletedMultipartUpload{ + Parts: []*oss.CompletedPart{ + {ETag: eTag, PartNumber: partNumber}, + }, + } + req := &oss.CompleteMultipartUploadInput{ + Bucket: "test.bucket", + Key: key, + UploadId: uploadId, + MultipartUpload: multipartUpload, + } + out, err := cephOss.CompleteMultipartUpload(context.Background(), req) + assert.Nil(t, err) + printOutput(out) +} +func listMultipartUploads(t *testing.T, cephOss oss.Oss) { + time.Sleep(time.Second) + fmt.Println("=====[ListMultipartUploads]") + req := &oss.ListMultipartUploadsInput{ + Bucket: "test.bucket", + } + out, err := cephOss.ListMultipartUploads(context.Background(), req) + assert.Nil(t, err) + printOutput(out) +} +func listParts(t *testing.T, cephOss oss.Oss, key, uploadId string) { + time.Sleep(time.Second) + fmt.Println("=====[ListParts]") + req := &oss.ListPartsInput{ + Bucket: "test.bucket", + Key: key, + UploadId: uploadId, + } + out, err := cephOss.ListParts(context.Background(), req) + assert.Nil(t, err) + printOutput(out) +} + +func printOutput(v interface{}) { + bs, _ := json.Marshal(v) + var bf bytes.Buffer + err := json.Indent(&bf, bs, "", "\t") + if err != nil { + log.Fatalln("ERROR:", err) + return + } + fmt.Println(bf.String()) +} + +func TestCephOss(t *testing.T) { + instance := &CephOss{} + err := instance.Init(context.TODO(), &oss.Config{Metadata: map[string]json.RawMessage{oss.BasicConfiguration: []byte(confWithoutUidAndBucket)}}) + assert.Nil(t, err) + + appendObjectResp, err := instance.AppendObject(context.TODO(), &oss.AppendObjectInput{}) + assert.Equal(t, errors.New("AppendObject method not supported on AWS"), err) + assert.Nil(t, appendObjectResp) + + _, err = instance.AbortMultipartUpload(context.TODO(), &oss.AbortMultipartUploadInput{}) + assert.NotNil(t, err) + + _, err = instance.CompleteMultipartUpload(context.TODO(), &oss.CompleteMultipartUploadInput{}) + assert.NotNil(t, err) + + _, err = instance.CopyObject(context.TODO(), &oss.CopyObjectInput{}) + assert.Equal(t, errors.New("must specific copy_source"), err) + + _, err = instance.CopyObject(context.TODO(), &oss.CopyObjectInput{ + CopySource: &oss.CopySource{CopySourceBucket: "bucket", CopySourceKey: "key"}, + }) + assert.NotEqual(t, errors.New("must specific copy_source"), err) + _, err = instance.CreateMultipartUpload(context.TODO(), &oss.CreateMultipartUploadInput{}) + assert.NotNil(t, err) + + _, err = instance.DeleteObject(context.TODO(), &oss.DeleteObjectInput{}) + assert.NotNil(t, err) + _, err = instance.DeleteObjects(context.TODO(), &oss.DeleteObjectsInput{ + Delete: &oss.Delete{Objects: []*oss.ObjectIdentifier{{Key: "object", VersionId: "version"}}}, + }) + assert.NotNil(t, err) + _, err = instance.DeleteObjectTagging(context.TODO(), &oss.DeleteObjectTaggingInput{}) + assert.NotNil(t, err) + + _, err = instance.GetObject(context.TODO(), &oss.GetObjectInput{}) + assert.NotNil(t, err) + _, err = instance.GetObjectCannedAcl(context.TODO(), &oss.GetObjectCannedAclInput{}) + assert.NotNil(t, err) + _, err = instance.GetObjectTagging(context.TODO(), &oss.GetObjectTaggingInput{}) + assert.NotNil(t, err) + + _, err = instance.HeadObject(context.TODO(), &oss.HeadObjectInput{}) + assert.NotNil(t, err) + + _, err = instance.IsObjectExist(context.TODO(), &oss.IsObjectExistInput{}) + assert.NotNil(t, err) + + _, err = instance.ListParts(context.TODO(), &oss.ListPartsInput{}) + assert.NotNil(t, err) + + _, err = instance.ListMultipartUploads(context.TODO(), &oss.ListMultipartUploadsInput{}) + assert.NotNil(t, err) + _, err = instance.ListObjects(context.TODO(), &oss.ListObjectsInput{}) + assert.NotNil(t, err) + _, err = instance.ListObjectVersions(context.TODO(), &oss.ListObjectVersionsInput{}) + assert.NotNil(t, err) + + stream := buffer.NewIoBufferString("hello") + _, err = instance.PutObject(context.TODO(), &oss.PutObjectInput{DataStream: stream}) + assert.NotNil(t, err) + _, err = instance.PutObjectCannedAcl(context.TODO(), &oss.PutObjectCannedAclInput{}) + assert.NotNil(t, err) + _, err = instance.PutObjectTagging(context.TODO(), &oss.PutObjectTaggingInput{}) + assert.NotNil(t, err) + + _, err = instance.RestoreObject(context.TODO(), &oss.RestoreObjectInput{}) + assert.NotNil(t, err) + + _, err = instance.SignURL(context.TODO(), &oss.SignURLInput{}) + assert.NotNil(t, err) + + _, err = instance.UploadPartCopy(context.TODO(), &oss.UploadPartCopyInput{ + CopySource: &oss.CopySource{CopySourceBucket: "bucket", CopySourceKey: "key"}, + }) + assert.NotNil(t, err) + + _, err = instance.UploadPart(context.TODO(), &oss.UploadPartInput{}) + assert.NotNil(t, err) + + err = instance.UpdateDownloadBandwidthRateLimit(context.TODO(), &oss.UpdateBandwidthRateLimitInput{}) + assert.NotNil(t, err) + + err = instance.UpdateUploadBandwidthRateLimit(context.TODO(), &oss.UpdateBandwidthRateLimitInput{}) + assert.NotNil(t, err) +} diff --git a/components/oss/oss.go b/components/oss/oss.go index 39c42d35ba..d069be2326 100644 --- a/components/oss/oss.go +++ b/components/oss/oss.go @@ -118,6 +118,7 @@ type PutObjectInput struct { SignedUrl string `json:"signed_url,omitempty"` Meta map[string]string `json:"meta,omitempty"` Tagging map[string]string `json:"tagging,omitempty"` + StorageClass string `json:"storage_class,omitempty"` } type PutObjectOutput struct { @@ -274,10 +275,59 @@ type PutObjectCannedAclOutput struct { RequestCharged string `json:"request_charged,omitempty"` } +type GlacierJobParameters struct { + Tier string `json:"tier,omitempty"` +} +type OutputLocation struct { + BucketName string `json:"bucket_name,omitempty"` + Prefix string `json:"prefix,omitempty"` +} +type CSVInput struct { + AllowQuotedRecordDelimiter bool `json:"allow_quoted_record_delimiter,omitempty"` + Comments string `json:"comments,omitempty"` + FieldDelimiter string `json:"field_delimiter,omitempty"` + FileHeaderInfo string `json:"file_header_info,omitempty"` + QuoteCharacter string `json:"quote_character,omitempty"` + QuoteEscapeCharacter string `json:"quote_escape_character,omitempty"` + RecordDelimiter string `json:"record_delimiter,omitempty"` +} +type InputSerialization struct { + CSV CSVInput `json:"csv,omitempty"` + CompressionType string `json:"compression_type,omitempty"` + JSON string `json:"json,omitempty"` +} +type CSVOutput struct { + FieldDelimiter string `json:"field_delimiter,omitempty"` + QuoteCharacter string `json:"quote_character,omitempty"` + QuoteEscapeCharacter string `json:"quote_escape_character,omitempty"` + QuoteFields string `json:"quote_fields,omitempty"` + RecordDelimiter string `json:"record_delimiter,omitempty"` +} +type OutputSerialization struct { + Csv CSVOutput `json:"csv,omitempty"` + Json string `json:"json,omitempty"` +} +type SelectParameters struct { + Expression string `json:"expression,omitempty"` + ExpressionType string `json:"expression_type,omitempty"` + InputSerialization InputSerialization `json:"input_serialization,omitempty"` + OutputSerialization OutputSerialization `json:"output_serialization,omitempty"` +} +type RestoreRequest struct { + Days int32 `json:"days,omitempty"` + Description string `json:"description,omitempty"` + GlacierJobParameters GlacierJobParameters `json:"glacier_job_parameters,omitempty"` + OutputLocation OutputLocation `json:"output_location,omitempty"` + SelectParameters SelectParameters `json:"select_parameters,omitempty"` + Tier string `json:"tier,omitempty"` + Type string `json:"type,omitempty"` +} + type RestoreObjectInput struct { - Bucket string `json:"bucket,omitempty"` - Key string `json:"key,omitempty"` - VersionId string `json:"version_id,omitempty"` + Bucket string `json:"bucket,omitempty"` + Key string `json:"key,omitempty"` + RestoreRequest RestoreRequest `json:"restore_request,omitempty"` + VersionId string `json:"version_id,omitempty"` } type RestoreObjectOutput struct { RequestCharged string `json:"request_charged,omitempty"` diff --git a/spec/proto/extension/v1/s3/oss.pb.go b/spec/proto/extension/v1/s3/oss.pb.go index f7b95045ef..b37c66a7ee 100644 --- a/spec/proto/extension/v1/s3/oss.pb.go +++ b/spec/proto/extension/v1/s3/oss.pb.go @@ -4,7 +4,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.0 +// protoc-gen-go v1.28.1 // protoc v3.17.3 // source: oss.proto @@ -550,6 +550,8 @@ type PutObjectInput struct { Meta map[string]string `protobuf:"bytes,13,rep,name=meta,proto3" json:"meta,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // The tag-set for the object. The tag-set must be encoded as URL Query parameters. Tagging map[string]string `protobuf:"bytes,14,rep,name=tagging,proto3" json:"tagging,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // Storage class options. + StorageClass string `protobuf:"bytes,15,opt,name=storage_class,json=storageClass,proto3" json:"storage_class,omitempty"` } func (x *PutObjectInput) Reset() { @@ -682,6 +684,13 @@ func (x *PutObjectInput) GetTagging() map[string]string { return nil } +func (x *PutObjectInput) GetStorageClass() string { + if x != nil { + return x.StorageClass + } + return "" +} + // PutObjectOutput type PutObjectOutput struct { state protoimpl.MessageState @@ -2720,26 +2729,19 @@ func (x *PutObjectCannedAclOutput) GetRequestCharged() string { return "" } -// RestoreObjectInput -type RestoreObjectInput struct { +// GlacierJobParameters +type GlacierJobParameters struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // Required. The name of oss store. - StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` - // The bucket name containing the object - // This member is required - Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` - // Name of the object key. + // Retrieval tier at which the restore will be processed. // This member is required. - Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` - // VersionId used to reference a specific version of the object. - VersionId string `protobuf:"bytes,5,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` + Tier string `protobuf:"bytes,1,opt,name=tier,proto3" json:"tier,omitempty"` } -func (x *RestoreObjectInput) Reset() { - *x = RestoreObjectInput{} +func (x *GlacierJobParameters) Reset() { + *x = GlacierJobParameters{} if protoimpl.UnsafeEnabled { mi := &file_oss_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -2747,13 +2749,13 @@ func (x *RestoreObjectInput) Reset() { } } -func (x *RestoreObjectInput) String() string { +func (x *GlacierJobParameters) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RestoreObjectInput) ProtoMessage() {} +func (*GlacierJobParameters) ProtoMessage() {} -func (x *RestoreObjectInput) ProtoReflect() protoreflect.Message { +func (x *GlacierJobParameters) ProtoReflect() protoreflect.Message { mi := &file_oss_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -2765,55 +2767,34 @@ func (x *RestoreObjectInput) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use RestoreObjectInput.ProtoReflect.Descriptor instead. -func (*RestoreObjectInput) Descriptor() ([]byte, []int) { +// Deprecated: Use GlacierJobParameters.ProtoReflect.Descriptor instead. +func (*GlacierJobParameters) Descriptor() ([]byte, []int) { return file_oss_proto_rawDescGZIP(), []int{29} } -func (x *RestoreObjectInput) GetStoreName() string { - if x != nil { - return x.StoreName - } - return "" -} - -func (x *RestoreObjectInput) GetBucket() string { - if x != nil { - return x.Bucket - } - return "" -} - -func (x *RestoreObjectInput) GetKey() string { - if x != nil { - return x.Key - } - return "" -} - -func (x *RestoreObjectInput) GetVersionId() string { +func (x *GlacierJobParameters) GetTier() string { if x != nil { - return x.VersionId + return x.Tier } return "" } -// RestoreObjectOutput -type RestoreObjectOutput struct { +// OutPutLocation +type OutputLocation struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // If present, indicates that the requester was successfully charged for the - // request. - RequestCharged string `protobuf:"bytes,1,opt,name=request_charged,json=requestCharged,proto3" json:"request_charged,omitempty"` - // Indicates the path in the provided S3 output location where Select results will - // be restored to. - RestoreOutputPath string `protobuf:"bytes,2,opt,name=restore_output_path,json=restoreOutputPath,proto3" json:"restore_output_path,omitempty"` + // The name of the bucket where the restore results will be placed. + // This member is required. + BucketName string `protobuf:"bytes,1,opt,name=bucket_name,json=bucketName,proto3" json:"bucket_name,omitempty"` + // The prefix that is prepended to the restore results for this request. + // This member is required. + Prefix string `protobuf:"bytes,2,opt,name=prefix,proto3" json:"prefix,omitempty"` } -func (x *RestoreObjectOutput) Reset() { - *x = RestoreObjectOutput{} +func (x *OutputLocation) Reset() { + *x = OutputLocation{} if protoimpl.UnsafeEnabled { mi := &file_oss_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -2821,13 +2802,13 @@ func (x *RestoreObjectOutput) Reset() { } } -func (x *RestoreObjectOutput) String() string { +func (x *OutputLocation) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RestoreObjectOutput) ProtoMessage() {} +func (*OutputLocation) ProtoMessage() {} -func (x *RestoreObjectOutput) ProtoReflect() protoreflect.Message { +func (x *OutputLocation) ProtoReflect() protoreflect.Message { mi := &file_oss_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -2839,112 +2820,70 @@ func (x *RestoreObjectOutput) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use RestoreObjectOutput.ProtoReflect.Descriptor instead. -func (*RestoreObjectOutput) Descriptor() ([]byte, []int) { +// Deprecated: Use OutputLocation.ProtoReflect.Descriptor instead. +func (*OutputLocation) Descriptor() ([]byte, []int) { return file_oss_proto_rawDescGZIP(), []int{30} } -func (x *RestoreObjectOutput) GetRequestCharged() string { +func (x *OutputLocation) GetBucketName() string { if x != nil { - return x.RequestCharged + return x.BucketName } return "" } -func (x *RestoreObjectOutput) GetRestoreOutputPath() string { +func (x *OutputLocation) GetPrefix() string { if x != nil { - return x.RestoreOutputPath + return x.Prefix } return "" } -// CreateMultipartUploadInput -type CreateMultipartUploadInput struct { +// CSVInput +type CSVInput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // Required. The name of oss store. - StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` - // The bucket name containing the object - // This member is required - Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` - // Name of the object key. - // This member is required. - Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` - // The canned ACL to apply to the object. This action is not supported by Amazon S3 - // on Outposts. - Acl string `protobuf:"bytes,4,opt,name=acl,proto3" json:"acl,omitempty"` - // Specifies whether Amazon S3 should use an S3 Bucket Key for object encryption - // with server-side encryption using AWS KMS (SSE-KMS). Setting this header to true - // causes Amazon S3 to use an S3 Bucket Key for object encryption with SSE-KMS. - // Specifying this header with a PUT action doesn’t affect bucket-level settings - // for S3 Bucket Key. - BucketKeyEnabled bool `protobuf:"varint,5,opt,name=bucket_key_enabled,json=bucketKeyEnabled,proto3" json:"bucket_key_enabled,omitempty"` - // Specifies caching behavior along the request/reply chain - CacheControl string `protobuf:"bytes,6,opt,name=cache_control,json=cacheControl,proto3" json:"cache_control,omitempty"` - // Specifies presentational information for the object - ContentDisposition string `protobuf:"bytes,7,opt,name=content_disposition,json=contentDisposition,proto3" json:"content_disposition,omitempty"` - // Specifies what content encodings have been applied to the object and thus what - // decoding mechanisms must be applied to obtain the media-type referenced by the - // Content-Type header field. - ContentEncoding string `protobuf:"bytes,8,opt,name=content_encoding,json=contentEncoding,proto3" json:"content_encoding,omitempty"` - // The language the content is in. - ContentLanguage string `protobuf:"bytes,9,opt,name=content_language,json=contentLanguage,proto3" json:"content_language,omitempty"` - // A standard MIME type describing the format of the object data. - ContentType string `protobuf:"bytes,10,opt,name=content_type,json=contentType,proto3" json:"content_type,omitempty"` - // The account ID of the expected bucket owner. If the bucket is owned by a - // different account, the request fails with the HTTP status code 403 Forbidden - // (access denied). - ExpectedBucketOwner string `protobuf:"bytes,11,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` - // The date and time at which the object is no longer cacheable. - Expires int64 `protobuf:"varint,12,opt,name=expires,proto3" json:"expires,omitempty"` - // Gives the grantee READ, READ_ACP, and WRITE_ACP permissions on the object. This - // action is not supported by Amazon S3 on Outposts. - GrantFullControl string `protobuf:"bytes,13,opt,name=grant_full_control,json=grantFullControl,proto3" json:"grant_full_control,omitempty"` - // Allows grantee to read the object data and its metadata. This action is not - // supported by Amazon S3 on Outposts. - GrantRead string `protobuf:"bytes,14,opt,name=grant_read,json=grantRead,proto3" json:"grant_read,omitempty"` - // Allows grantee to read the object ACL. This action is not supported by Amazon S3 - // on Outposts. - GrantReadAcp string `protobuf:"bytes,15,opt,name=grant_read_acp,json=grantReadAcp,proto3" json:"grant_read_acp,omitempty"` - // Allows grantee to write the ACL for the applicable object. This action is not - // supported by Amazon S3 on Outposts. - GrantWriteAcp string `protobuf:"bytes,16,opt,name=grant_write_acp,json=grantWriteAcp,proto3" json:"grant_write_acp,omitempty"` - // A map of metadata to store with the object - MetaData map[string]string `protobuf:"bytes,17,rep,name=meta_data,json=metaData,proto3" json:"meta_data,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - // Specifies whether you want to apply a legal hold to the uploaded object - ObjectLockLegalHoldStatus string `protobuf:"bytes,18,opt,name=object_lock_legal_hold_status,json=objectLockLegalHoldStatus,proto3" json:"object_lock_legal_hold_status,omitempty"` - // Specifies the Object Lock mode that you want to apply to the uploaded object - ObjectLockMode string `protobuf:"bytes,19,opt,name=object_lock_mode,json=objectLockMode,proto3" json:"object_lock_mode,omitempty"` - // Specifies the date and time when you want the Object Lock to expire - ObjectLockRetainUntilDate int64 `protobuf:"varint,20,opt,name=object_lock_retain_until_date,json=objectLockRetainUntilDate,proto3" json:"object_lock_retain_until_date,omitempty"` - // Confirms that the requester knows that they will be charged for the request - RequestPayer string `protobuf:"bytes,21,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` - // Specifies the algorithm to use to when encrypting the object (for example, - // AES256). - SseCustomerAlgorithm string `protobuf:"bytes,22,opt,name=sse_customer_algorithm,json=sseCustomerAlgorithm,proto3" json:"sse_customer_algorithm,omitempty"` - // Specifies the customer-provided encryption key to use in encrypting data - SseCustomerKey string `protobuf:"bytes,23,opt,name=sse_customer_key,json=sseCustomerKey,proto3" json:"sse_customer_key,omitempty"` - // Specifies the 128-bit MD5 digest of the encryption key according to RFC 1321 - SseCustomerKeyMd5 string `protobuf:"bytes,24,opt,name=sse_customer_key_md5,json=sseCustomerKeyMd5,proto3" json:"sse_customer_key_md5,omitempty"` - // Specifies the Amazon Web Services KMS Encryption Context to use for object encryption - SseKmsEncryptionContext string `protobuf:"bytes,25,opt,name=sse_kms_encryption_context,json=sseKmsEncryptionContext,proto3" json:"sse_kms_encryption_context,omitempty"` - // Specifies the ID of the symmetric customer managed key to use for object encryption - SseKmsKeyId string `protobuf:"bytes,26,opt,name=sse_kms_key_id,json=sseKmsKeyId,proto3" json:"sse_kms_key_id,omitempty"` - // The server-side encryption algorithm used when storing this object - ServerSideEncryption string `protobuf:"bytes,27,opt,name=server_side_encryption,json=serverSideEncryption,proto3" json:"server_side_encryption,omitempty"` - // By default, oss store uses the STANDARD Storage Class to store newly created objects - StorageClass string `protobuf:"bytes,28,opt,name=storage_class,json=storageClass,proto3" json:"storage_class,omitempty"` - // The tag-set for the object. The tag-set must be encoded as URL Query parameters. - Tagging map[string]string `protobuf:"bytes,29,rep,name=tagging,proto3" json:"tagging,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - // If the bucket is configured as a website, redirects requests for this object to - // another object in the same bucket or to an external URL. - WebsiteRedirectLocation string `protobuf:"bytes,30,opt,name=website_redirect_location,json=websiteRedirectLocation,proto3" json:"website_redirect_location,omitempty"` -} - -func (x *CreateMultipartUploadInput) Reset() { - *x = CreateMultipartUploadInput{} + // Specifies that CSV field values may contain quoted record delimiters and such + // records should be allowed. Default value is FALSE. Setting this value to TRUE + // may lower performance. + AllowQuotedRecordDelimiter bool `protobuf:"varint,1,opt,name=allow_quoted_record_delimiter,json=allowQuotedRecordDelimiter,proto3" json:"allow_quoted_record_delimiter,omitempty"` + // A single character used to indicate that a row should be ignored when the + // character is present at the start of that row. You can specify any character to + // indicate a comment line. + Comments string `protobuf:"bytes,2,opt,name=comments,proto3" json:"comments,omitempty"` + // A single character used to separate individual fields in a record. You can + // specify an arbitrary delimiter. + FieldDelimiter string `protobuf:"bytes,3,opt,name=field_delimiter,json=fieldDelimiter,proto3" json:"field_delimiter,omitempty"` + // Describes the first line of input. Valid values are: + // + // * NONE: First line is not + // a header. + // + // * IGNORE: First line is a header, but you can't use the header values + // to indicate the column in an expression. You can use column position (such as + // _1, _2, …) to indicate the column (SELECT s._1 FROM OBJECT s). + // + // * Use: First + // line is a header, and you can use the header value to identify a column in an + // expression (SELECT "name" FROM OBJECT). + FileHeaderInfo string `protobuf:"bytes,4,opt,name=file_header_info,json=fileHeaderInfo,proto3" json:"file_header_info,omitempty"` + // A single character used for escaping when the field delimiter is part of the + // value. For example, if the value is a, b, Amazon S3 wraps this field value in + // quotation marks, as follows: " a , b ". Type: String Default: " Ancestors: CSV + QuoteCharacter string `protobuf:"bytes,5,opt,name=quote_character,json=quoteCharacter,proto3" json:"quote_character,omitempty"` + // A single character used for escaping the quotation mark character inside an + // already escaped value. For example, the value """ a , b """ is parsed as " a , b + // ". + QuoteEscapeCharacter string `protobuf:"bytes,6,opt,name=quote_escape_character,json=quoteEscapeCharacter,proto3" json:"quote_escape_character,omitempty"` + // A single character used to separate individual records in the input. Instead of + // the default value, you can specify an arbitrary delimiter. + RecordDelimiter string `protobuf:"bytes,7,opt,name=record_delimiter,json=recordDelimiter,proto3" json:"record_delimiter,omitempty"` +} + +func (x *CSVInput) Reset() { + *x = CSVInput{} if protoimpl.UnsafeEnabled { mi := &file_oss_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -2952,13 +2891,13 @@ func (x *CreateMultipartUploadInput) Reset() { } } -func (x *CreateMultipartUploadInput) String() string { +func (x *CSVInput) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CreateMultipartUploadInput) ProtoMessage() {} +func (*CSVInput) ProtoMessage() {} -func (x *CreateMultipartUploadInput) ProtoReflect() protoreflect.Message { +func (x *CSVInput) ProtoReflect() protoreflect.Message { mi := &file_oss_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -2970,285 +2909,319 @@ func (x *CreateMultipartUploadInput) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use CreateMultipartUploadInput.ProtoReflect.Descriptor instead. -func (*CreateMultipartUploadInput) Descriptor() ([]byte, []int) { +// Deprecated: Use CSVInput.ProtoReflect.Descriptor instead. +func (*CSVInput) Descriptor() ([]byte, []int) { return file_oss_proto_rawDescGZIP(), []int{31} } -func (x *CreateMultipartUploadInput) GetStoreName() string { +func (x *CSVInput) GetAllowQuotedRecordDelimiter() bool { if x != nil { - return x.StoreName + return x.AllowQuotedRecordDelimiter } - return "" + return false } -func (x *CreateMultipartUploadInput) GetBucket() string { +func (x *CSVInput) GetComments() string { if x != nil { - return x.Bucket + return x.Comments } return "" } -func (x *CreateMultipartUploadInput) GetKey() string { +func (x *CSVInput) GetFieldDelimiter() string { if x != nil { - return x.Key + return x.FieldDelimiter } return "" } -func (x *CreateMultipartUploadInput) GetAcl() string { +func (x *CSVInput) GetFileHeaderInfo() string { if x != nil { - return x.Acl + return x.FileHeaderInfo } return "" } -func (x *CreateMultipartUploadInput) GetBucketKeyEnabled() bool { +func (x *CSVInput) GetQuoteCharacter() string { if x != nil { - return x.BucketKeyEnabled + return x.QuoteCharacter } - return false + return "" } -func (x *CreateMultipartUploadInput) GetCacheControl() string { +func (x *CSVInput) GetQuoteEscapeCharacter() string { if x != nil { - return x.CacheControl + return x.QuoteEscapeCharacter } return "" } -func (x *CreateMultipartUploadInput) GetContentDisposition() string { +func (x *CSVInput) GetRecordDelimiter() string { if x != nil { - return x.ContentDisposition + return x.RecordDelimiter } return "" } -func (x *CreateMultipartUploadInput) GetContentEncoding() string { - if x != nil { - return x.ContentEncoding +// InputSerialization +type InputSerialization struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Describes the serialization of a CSV-encoded object. + Csv *CSVInput `protobuf:"bytes,1,opt,name=csv,proto3" json:"csv,omitempty"` + // Specifies object's compression format. Valid values: NONE, GZIP, BZIP2. Default + // Value: NONE. + CompressionType string `protobuf:"bytes,2,opt,name=compression_type,json=compressionType,proto3" json:"compression_type,omitempty"` + // Specifies JSON as object's input serialization format. + Json string `protobuf:"bytes,3,opt,name=json,proto3" json:"json,omitempty"` +} + +func (x *InputSerialization) Reset() { + *x = InputSerialization{} + if protoimpl.UnsafeEnabled { + mi := &file_oss_proto_msgTypes[32] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return "" } -func (x *CreateMultipartUploadInput) GetContentLanguage() string { +func (x *InputSerialization) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*InputSerialization) ProtoMessage() {} + +func (x *InputSerialization) ProtoReflect() protoreflect.Message { + mi := &file_oss_proto_msgTypes[32] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use InputSerialization.ProtoReflect.Descriptor instead. +func (*InputSerialization) Descriptor() ([]byte, []int) { + return file_oss_proto_rawDescGZIP(), []int{32} +} + +func (x *InputSerialization) GetCsv() *CSVInput { if x != nil { - return x.ContentLanguage + return x.Csv } - return "" + return nil } -func (x *CreateMultipartUploadInput) GetContentType() string { +func (x *InputSerialization) GetCompressionType() string { if x != nil { - return x.ContentType + return x.CompressionType } return "" } -func (x *CreateMultipartUploadInput) GetExpectedBucketOwner() string { +func (x *InputSerialization) GetJson() string { if x != nil { - return x.ExpectedBucketOwner + return x.Json } return "" } -func (x *CreateMultipartUploadInput) GetExpires() int64 { - if x != nil { - return x.Expires +// CSVOutput +type CSVOutput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The value used to separate individual fields in a record. You can specify an + // arbitrary delimiter. + FieldDelimiter string `protobuf:"bytes,1,opt,name=field_delimiter,json=fieldDelimiter,proto3" json:"field_delimiter,omitempty"` + // A single character used for escaping when the field delimiter is part of the + // value. For example, if the value is a, b, Amazon S3 wraps this field value in + // quotation marks, as follows: " a , b ". + QuoteCharacter string `protobuf:"bytes,2,opt,name=quote_character,json=quoteCharacter,proto3" json:"quote_character,omitempty"` + // The single character used for escaping the quote character inside an already + // escaped value. + QuoteEscapeCharacter string `protobuf:"bytes,3,opt,name=quote_escape_character,json=quoteEscapeCharacter,proto3" json:"quote_escape_character,omitempty"` + // Indicates whether to use quotation marks around output fields. + // + // * ALWAYS: Always + // use quotation marks for output fields. + // + // * ASNEEDED: Use quotation marks for + // output fields when needed. + QuoteFields string `protobuf:"bytes,4,opt,name=quote_fields,json=quoteFields,proto3" json:"quote_fields,omitempty"` + // A single character used to separate individual records in the output. Instead of + // the default value, you can specify an arbitrary delimiter. + RecordDelimiter string `protobuf:"bytes,5,opt,name=record_delimiter,json=recordDelimiter,proto3" json:"record_delimiter,omitempty"` +} + +func (x *CSVOutput) Reset() { + *x = CSVOutput{} + if protoimpl.UnsafeEnabled { + mi := &file_oss_proto_msgTypes[33] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return 0 } -func (x *CreateMultipartUploadInput) GetGrantFullControl() string { - if x != nil { - return x.GrantFullControl +func (x *CSVOutput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CSVOutput) ProtoMessage() {} + +func (x *CSVOutput) ProtoReflect() protoreflect.Message { + mi := &file_oss_proto_msgTypes[33] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return "" + return mi.MessageOf(x) } -func (x *CreateMultipartUploadInput) GetGrantRead() string { +// Deprecated: Use CSVOutput.ProtoReflect.Descriptor instead. +func (*CSVOutput) Descriptor() ([]byte, []int) { + return file_oss_proto_rawDescGZIP(), []int{33} +} + +func (x *CSVOutput) GetFieldDelimiter() string { if x != nil { - return x.GrantRead + return x.FieldDelimiter } return "" } -func (x *CreateMultipartUploadInput) GetGrantReadAcp() string { +func (x *CSVOutput) GetQuoteCharacter() string { if x != nil { - return x.GrantReadAcp + return x.QuoteCharacter } return "" } -func (x *CreateMultipartUploadInput) GetGrantWriteAcp() string { +func (x *CSVOutput) GetQuoteEscapeCharacter() string { if x != nil { - return x.GrantWriteAcp + return x.QuoteEscapeCharacter } return "" } -func (x *CreateMultipartUploadInput) GetMetaData() map[string]string { +func (x *CSVOutput) GetQuoteFields() string { if x != nil { - return x.MetaData + return x.QuoteFields } - return nil + return "" } -func (x *CreateMultipartUploadInput) GetObjectLockLegalHoldStatus() string { - if x != nil { - return x.ObjectLockLegalHoldStatus - } - return "" -} - -func (x *CreateMultipartUploadInput) GetObjectLockMode() string { - if x != nil { - return x.ObjectLockMode - } - return "" -} - -func (x *CreateMultipartUploadInput) GetObjectLockRetainUntilDate() int64 { - if x != nil { - return x.ObjectLockRetainUntilDate - } - return 0 -} - -func (x *CreateMultipartUploadInput) GetRequestPayer() string { +func (x *CSVOutput) GetRecordDelimiter() string { if x != nil { - return x.RequestPayer + return x.RecordDelimiter } return "" } -func (x *CreateMultipartUploadInput) GetSseCustomerAlgorithm() string { - if x != nil { - return x.SseCustomerAlgorithm - } - return "" -} +// OutputSerialization +type OutputSerialization struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (x *CreateMultipartUploadInput) GetSseCustomerKey() string { - if x != nil { - return x.SseCustomerKey - } - return "" + // Describes the serialization of CSV-encoded Select results. + Csv *CSVOutput `protobuf:"bytes,1,opt,name=csv,proto3" json:"csv,omitempty"` + // Specifies JSON as request's output serialization format. + Json string `protobuf:"bytes,2,opt,name=json,proto3" json:"json,omitempty"` } -func (x *CreateMultipartUploadInput) GetSseCustomerKeyMd5() string { - if x != nil { - return x.SseCustomerKeyMd5 +func (x *OutputSerialization) Reset() { + *x = OutputSerialization{} + if protoimpl.UnsafeEnabled { + mi := &file_oss_proto_msgTypes[34] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return "" } -func (x *CreateMultipartUploadInput) GetSseKmsEncryptionContext() string { - if x != nil { - return x.SseKmsEncryptionContext - } - return "" +func (x *OutputSerialization) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *CreateMultipartUploadInput) GetSseKmsKeyId() string { - if x != nil { - return x.SseKmsKeyId - } - return "" -} +func (*OutputSerialization) ProtoMessage() {} -func (x *CreateMultipartUploadInput) GetServerSideEncryption() string { - if x != nil { - return x.ServerSideEncryption +func (x *OutputSerialization) ProtoReflect() protoreflect.Message { + mi := &file_oss_proto_msgTypes[34] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return "" + return mi.MessageOf(x) } -func (x *CreateMultipartUploadInput) GetStorageClass() string { - if x != nil { - return x.StorageClass - } - return "" +// Deprecated: Use OutputSerialization.ProtoReflect.Descriptor instead. +func (*OutputSerialization) Descriptor() ([]byte, []int) { + return file_oss_proto_rawDescGZIP(), []int{34} } -func (x *CreateMultipartUploadInput) GetTagging() map[string]string { +func (x *OutputSerialization) GetCsv() *CSVOutput { if x != nil { - return x.Tagging + return x.Csv } return nil } -func (x *CreateMultipartUploadInput) GetWebsiteRedirectLocation() string { +func (x *OutputSerialization) GetJson() string { if x != nil { - return x.WebsiteRedirectLocation + return x.Json } return "" } -// CreateMultipartUploadOutput -type CreateMultipartUploadOutput struct { +// SelectParameters +type SelectParameters struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // The bucket name containing the object - // This member is required - Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` - // Name of the object key. + // The expression that is used to query the object. // This member is required. - Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` - // If the bucket has a lifecycle rule configured with an action to abort incomplete - // multipart uploads and the prefix in the lifecycle rule matches the object name - // in the request, the response includes this header - AbortDate int64 `protobuf:"varint,3,opt,name=abort_date,json=abortDate,proto3" json:"abort_date,omitempty"` - // It identifies the applicable lifecycle configuration rule that defines the action to abort - // incomplete multipart uploads. - AbortRuleId string `protobuf:"bytes,4,opt,name=abort_rule_id,json=abortRuleId,proto3" json:"abort_rule_id,omitempty"` - // Indicates whether the multipart upload uses an S3 Bucket Key for server-side - // encryption with Amazon Web Services KMS (SSE-KMS). - BucketKeyEnabled bool `protobuf:"varint,5,opt,name=bucket_key_enabled,json=bucketKeyEnabled,proto3" json:"bucket_key_enabled,omitempty"` - // If present, indicates that the requester was successfully charged for the - // request. - RequestCharged string `protobuf:"bytes,6,opt,name=request_charged,json=requestCharged,proto3" json:"request_charged,omitempty"` - // If server-side encryption with a customer-provided encryption key was requested, - // the response will include this header confirming the encryption algorithm used. - SseCustomerAlgorithm string `protobuf:"bytes,7,opt,name=sse_customer_algorithm,json=sseCustomerAlgorithm,proto3" json:"sse_customer_algorithm,omitempty"` - // If server-side encryption with a customer-provided encryption key was requested, - // the response will include this header to provide round-trip message integrity - // verification of the customer-provided encryption key. - SseCustomerKeyMd5 string `protobuf:"bytes,8,opt,name=sse_customer_key_md5,json=sseCustomerKeyMd5,proto3" json:"sse_customer_key_md5,omitempty"` - // If present, specifies the Amazon Web Services KMS Encryption Context to use for - // object encryption. The value of this header is a base64-encoded UTF-8 string - // holding JSON with the encryption context key-value pairs. - SseKmsEncryptionContext string `protobuf:"bytes,9,opt,name=sse_kms_encryption_context,json=sseKmsEncryptionContext,proto3" json:"sse_kms_encryption_context,omitempty"` - // If present, specifies the ID of the Amazon Web Services Key Management Service - // (Amazon Web Services KMS) symmetric customer managed key that was used for the - // object. - SseKmsKeyId string `protobuf:"bytes,10,opt,name=sse_kms_key_id,json=sseKmsKeyId,proto3" json:"sse_kms_key_id,omitempty"` - // The server-side encryption algorithm used when storing this object in Amazon S3 - // (for example, AES256, aws:kms). - ServerSideEncryption string `protobuf:"bytes,11,opt,name=server_side_encryption,json=serverSideEncryption,proto3" json:"server_side_encryption,omitempty"` - // ID for the initiated multipart upload. - UploadId string `protobuf:"bytes,12,opt,name=upload_id,json=uploadId,proto3" json:"upload_id,omitempty"` + Expression string `protobuf:"bytes,1,opt,name=expression,proto3" json:"expression,omitempty"` + // The type of the provided expression (for example, SQL). + // This member is required. + ExpressionType string `protobuf:"bytes,2,opt,name=expression_type,json=expressionType,proto3" json:"expression_type,omitempty"` + // Describes the serialization format of the object. + // This member is required. + InputSerialization *InputSerialization `protobuf:"bytes,3,opt,name=input_serialization,json=inputSerialization,proto3" json:"input_serialization,omitempty"` + // Describes how the results of the Select job are serialized. + // This member is required. + OutputSerialization *OutputSerialization `protobuf:"bytes,4,opt,name=output_serialization,json=outputSerialization,proto3" json:"output_serialization,omitempty"` } -func (x *CreateMultipartUploadOutput) Reset() { - *x = CreateMultipartUploadOutput{} +func (x *SelectParameters) Reset() { + *x = SelectParameters{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[32] + mi := &file_oss_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *CreateMultipartUploadOutput) String() string { +func (x *SelectParameters) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CreateMultipartUploadOutput) ProtoMessage() {} +func (*SelectParameters) ProtoMessage() {} -func (x *CreateMultipartUploadOutput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[32] +func (x *SelectParameters) ProtoReflect() protoreflect.Message { + mi := &file_oss_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3259,97 +3232,144 @@ func (x *CreateMultipartUploadOutput) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use CreateMultipartUploadOutput.ProtoReflect.Descriptor instead. -func (*CreateMultipartUploadOutput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{32} +// Deprecated: Use SelectParameters.ProtoReflect.Descriptor instead. +func (*SelectParameters) Descriptor() ([]byte, []int) { + return file_oss_proto_rawDescGZIP(), []int{35} } -func (x *CreateMultipartUploadOutput) GetBucket() string { +func (x *SelectParameters) GetExpression() string { if x != nil { - return x.Bucket + return x.Expression } return "" } -func (x *CreateMultipartUploadOutput) GetKey() string { +func (x *SelectParameters) GetExpressionType() string { if x != nil { - return x.Key + return x.ExpressionType } return "" } -func (x *CreateMultipartUploadOutput) GetAbortDate() int64 { +func (x *SelectParameters) GetInputSerialization() *InputSerialization { if x != nil { - return x.AbortDate + return x.InputSerialization } - return 0 + return nil } -func (x *CreateMultipartUploadOutput) GetAbortRuleId() string { +func (x *SelectParameters) GetOutputSerialization() *OutputSerialization { if x != nil { - return x.AbortRuleId + return x.OutputSerialization } - return "" + return nil } -func (x *CreateMultipartUploadOutput) GetBucketKeyEnabled() bool { - if x != nil { - return x.BucketKeyEnabled +// RestoreRequest +type RestoreRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Lifetime of the active copy in days. + Days int32 `protobuf:"varint,1,opt,name=days,proto3" json:"days,omitempty"` + // The optional description for the job. + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` + // S3 Glacier related parameters pertaining to this job. + GlacierJobParameters *GlacierJobParameters `protobuf:"bytes,3,opt,name=glacier_job_parameters,json=glacierJobParameters,proto3" json:"glacier_job_parameters,omitempty"` + // Describes the location where the restore job's output is stored. + OutputLocation *OutputLocation `protobuf:"bytes,4,opt,name=output_location,json=outputLocation,proto3" json:"output_location,omitempty"` + // Describes the parameters for Select job types. + SelectParameters *SelectParameters `protobuf:"bytes,5,opt,name=select_parameters,json=selectParameters,proto3" json:"select_parameters,omitempty"` + // Retrieval tier at which the restore will be processed. + Tier string `protobuf:"bytes,6,opt,name=tier,proto3" json:"tier,omitempty"` + // Type of restore request. + Type string `protobuf:"bytes,7,opt,name=type,proto3" json:"type,omitempty"` +} + +func (x *RestoreRequest) Reset() { + *x = RestoreRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_oss_proto_msgTypes[36] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return false } -func (x *CreateMultipartUploadOutput) GetRequestCharged() string { +func (x *RestoreRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RestoreRequest) ProtoMessage() {} + +func (x *RestoreRequest) ProtoReflect() protoreflect.Message { + mi := &file_oss_proto_msgTypes[36] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RestoreRequest.ProtoReflect.Descriptor instead. +func (*RestoreRequest) Descriptor() ([]byte, []int) { + return file_oss_proto_rawDescGZIP(), []int{36} +} + +func (x *RestoreRequest) GetDays() int32 { if x != nil { - return x.RequestCharged + return x.Days } - return "" + return 0 } -func (x *CreateMultipartUploadOutput) GetSseCustomerAlgorithm() string { +func (x *RestoreRequest) GetDescription() string { if x != nil { - return x.SseCustomerAlgorithm + return x.Description } return "" } -func (x *CreateMultipartUploadOutput) GetSseCustomerKeyMd5() string { +func (x *RestoreRequest) GetGlacierJobParameters() *GlacierJobParameters { if x != nil { - return x.SseCustomerKeyMd5 + return x.GlacierJobParameters } - return "" + return nil } -func (x *CreateMultipartUploadOutput) GetSseKmsEncryptionContext() string { +func (x *RestoreRequest) GetOutputLocation() *OutputLocation { if x != nil { - return x.SseKmsEncryptionContext + return x.OutputLocation } - return "" + return nil } -func (x *CreateMultipartUploadOutput) GetSseKmsKeyId() string { +func (x *RestoreRequest) GetSelectParameters() *SelectParameters { if x != nil { - return x.SseKmsKeyId + return x.SelectParameters } - return "" + return nil } -func (x *CreateMultipartUploadOutput) GetServerSideEncryption() string { +func (x *RestoreRequest) GetTier() string { if x != nil { - return x.ServerSideEncryption + return x.Tier } return "" } -func (x *CreateMultipartUploadOutput) GetUploadId() string { +func (x *RestoreRequest) GetType() string { if x != nil { - return x.UploadId + return x.Type } return "" } -// UploadPartInput -type UploadPartInput struct { +// RestoreObjectInput +type RestoreObjectInput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -3362,50 +3382,29 @@ type UploadPartInput struct { // Name of the object key. // This member is required. Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` - // Object data. - Body []byte `protobuf:"bytes,4,opt,name=body,proto3" json:"body,omitempty"` - // Size of the body in bytes. This parameter is useful when the size of the body - // cannot be determined automatically. - ContentLength int64 `protobuf:"varint,5,opt,name=content_length,json=contentLength,proto3" json:"content_length,omitempty"` - // The base64-encoded 128-bit MD5 digest of the part data. - ContentMd5 string `protobuf:"bytes,6,opt,name=content_md5,json=contentMd5,proto3" json:"content_md5,omitempty"` - // The account ID of the expected bucket owner - ExpectedBucketOwner string `protobuf:"bytes,7,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` - // Part number of part being uploaded. This is a positive integer between 1 and 10,000. - // This member is required. - PartNumber int32 `protobuf:"varint,8,opt,name=part_number,json=partNumber,proto3" json:"part_number,omitempty"` - // Confirms that the requester knows that they will be charged for the request. - RequestPayer string `protobuf:"bytes,9,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` - // Specifies the algorithm to use to when encrypting the object (for example, - // AES256). - SseCustomerAlgorithm string `protobuf:"bytes,10,opt,name=sse_customer_algorithm,json=sseCustomerAlgorithm,proto3" json:"sse_customer_algorithm,omitempty"` - // Specifies the customer-provided encryption key for Amazon S3 to use in - // encrypting data - SseCustomerKey string `protobuf:"bytes,11,opt,name=sse_customer_key,json=sseCustomerKey,proto3" json:"sse_customer_key,omitempty"` - // Specifies the 128-bit MD5 digest of the encryption key according to RFC 1321. - SseCustomerKeyMd5 string `protobuf:"bytes,12,opt,name=sse_customer_key_md5,json=sseCustomerKeyMd5,proto3" json:"sse_customer_key_md5,omitempty"` - // Upload ID identifying the multipart upload whose part is being uploaded. - // This member is required. - UploadId string `protobuf:"bytes,13,opt,name=upload_id,json=uploadId,proto3" json:"upload_id,omitempty"` + // The information of restoring request. + RestoreRequest *RestoreRequest `protobuf:"bytes,4,opt,name=restore_request,json=restoreRequest,proto3" json:"restore_request,omitempty"` + // VersionId used to reference a specific version of the object. + VersionId string `protobuf:"bytes,5,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` } -func (x *UploadPartInput) Reset() { - *x = UploadPartInput{} +func (x *RestoreObjectInput) Reset() { + *x = RestoreObjectInput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[33] + mi := &file_oss_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *UploadPartInput) String() string { +func (x *RestoreObjectInput) String() string { return protoimpl.X.MessageStringOf(x) } -func (*UploadPartInput) ProtoMessage() {} +func (*RestoreObjectInput) ProtoMessage() {} -func (x *UploadPartInput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[33] +func (x *RestoreObjectInput) ProtoReflect() protoreflect.Message { + mi := &file_oss_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3416,145 +3415,208 @@ func (x *UploadPartInput) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use UploadPartInput.ProtoReflect.Descriptor instead. -func (*UploadPartInput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{33} +// Deprecated: Use RestoreObjectInput.ProtoReflect.Descriptor instead. +func (*RestoreObjectInput) Descriptor() ([]byte, []int) { + return file_oss_proto_rawDescGZIP(), []int{37} } -func (x *UploadPartInput) GetStoreName() string { +func (x *RestoreObjectInput) GetStoreName() string { if x != nil { return x.StoreName } return "" } -func (x *UploadPartInput) GetBucket() string { +func (x *RestoreObjectInput) GetBucket() string { if x != nil { return x.Bucket } return "" } -func (x *UploadPartInput) GetKey() string { +func (x *RestoreObjectInput) GetKey() string { if x != nil { return x.Key } return "" } -func (x *UploadPartInput) GetBody() []byte { +func (x *RestoreObjectInput) GetRestoreRequest() *RestoreRequest { if x != nil { - return x.Body + return x.RestoreRequest } return nil } -func (x *UploadPartInput) GetContentLength() int64 { - if x != nil { - return x.ContentLength - } - return 0 -} - -func (x *UploadPartInput) GetContentMd5() string { +func (x *RestoreObjectInput) GetVersionId() string { if x != nil { - return x.ContentMd5 + return x.VersionId } return "" } -func (x *UploadPartInput) GetExpectedBucketOwner() string { - if x != nil { - return x.ExpectedBucketOwner - } - return "" +// RestoreObjectOutput +type RestoreObjectOutput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // If present, indicates that the requester was successfully charged for the + // request. + RequestCharged string `protobuf:"bytes,1,opt,name=request_charged,json=requestCharged,proto3" json:"request_charged,omitempty"` + // Indicates the path in the provided S3 output location where Select results will + // be restored to. + RestoreOutputPath string `protobuf:"bytes,2,opt,name=restore_output_path,json=restoreOutputPath,proto3" json:"restore_output_path,omitempty"` } -func (x *UploadPartInput) GetPartNumber() int32 { - if x != nil { - return x.PartNumber +func (x *RestoreObjectOutput) Reset() { + *x = RestoreObjectOutput{} + if protoimpl.UnsafeEnabled { + mi := &file_oss_proto_msgTypes[38] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return 0 } -func (x *UploadPartInput) GetRequestPayer() string { - if x != nil { - return x.RequestPayer - } - return "" +func (x *RestoreObjectOutput) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *UploadPartInput) GetSseCustomerAlgorithm() string { - if x != nil { - return x.SseCustomerAlgorithm +func (*RestoreObjectOutput) ProtoMessage() {} + +func (x *RestoreObjectOutput) ProtoReflect() protoreflect.Message { + mi := &file_oss_proto_msgTypes[38] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return "" + return mi.MessageOf(x) } -func (x *UploadPartInput) GetSseCustomerKey() string { - if x != nil { - return x.SseCustomerKey - } - return "" +// Deprecated: Use RestoreObjectOutput.ProtoReflect.Descriptor instead. +func (*RestoreObjectOutput) Descriptor() ([]byte, []int) { + return file_oss_proto_rawDescGZIP(), []int{38} } -func (x *UploadPartInput) GetSseCustomerKeyMd5() string { +func (x *RestoreObjectOutput) GetRequestCharged() string { if x != nil { - return x.SseCustomerKeyMd5 + return x.RequestCharged } return "" } -func (x *UploadPartInput) GetUploadId() string { +func (x *RestoreObjectOutput) GetRestoreOutputPath() string { if x != nil { - return x.UploadId + return x.RestoreOutputPath } return "" } -// UploadPartOutput -type UploadPartOutput struct { +// CreateMultipartUploadInput +type CreateMultipartUploadInput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // Indicates whether the multipart upload uses an S3 Bucket Key for server-side - // encryption with Amazon Web Services KMS (SSE-KMS). - BucketKeyEnabled bool `protobuf:"varint,1,opt,name=bucket_key_enabled,json=bucketKeyEnabled,proto3" json:"bucket_key_enabled,omitempty"` - // Entity tag for the uploaded object. - Etag string `protobuf:"bytes,2,opt,name=etag,proto3" json:"etag,omitempty"` - // If present, indicates that the requester was successfully charged for the - // request. - RequestCharged string `protobuf:"bytes,3,opt,name=request_charged,json=requestCharged,proto3" json:"request_charged,omitempty"` + // Required. The name of oss store. + StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` + // The bucket name containing the object + // This member is required + Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` + // Name of the object key. + // This member is required. + Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` + // The canned ACL to apply to the object. This action is not supported by Amazon S3 + // on Outposts. + Acl string `protobuf:"bytes,4,opt,name=acl,proto3" json:"acl,omitempty"` + // Specifies whether Amazon S3 should use an S3 Bucket Key for object encryption + // with server-side encryption using AWS KMS (SSE-KMS). Setting this header to true + // causes Amazon S3 to use an S3 Bucket Key for object encryption with SSE-KMS. + // Specifying this header with a PUT action doesn’t affect bucket-level settings + // for S3 Bucket Key. + BucketKeyEnabled bool `protobuf:"varint,5,opt,name=bucket_key_enabled,json=bucketKeyEnabled,proto3" json:"bucket_key_enabled,omitempty"` + // Specifies caching behavior along the request/reply chain + CacheControl string `protobuf:"bytes,6,opt,name=cache_control,json=cacheControl,proto3" json:"cache_control,omitempty"` + // Specifies presentational information for the object + ContentDisposition string `protobuf:"bytes,7,opt,name=content_disposition,json=contentDisposition,proto3" json:"content_disposition,omitempty"` + // Specifies what content encodings have been applied to the object and thus what + // decoding mechanisms must be applied to obtain the media-type referenced by the + // Content-Type header field. + ContentEncoding string `protobuf:"bytes,8,opt,name=content_encoding,json=contentEncoding,proto3" json:"content_encoding,omitempty"` + // The language the content is in. + ContentLanguage string `protobuf:"bytes,9,opt,name=content_language,json=contentLanguage,proto3" json:"content_language,omitempty"` + // A standard MIME type describing the format of the object data. + ContentType string `protobuf:"bytes,10,opt,name=content_type,json=contentType,proto3" json:"content_type,omitempty"` + // The account ID of the expected bucket owner. If the bucket is owned by a + // different account, the request fails with the HTTP status code 403 Forbidden + // (access denied). + ExpectedBucketOwner string `protobuf:"bytes,11,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` + // The date and time at which the object is no longer cacheable. + Expires int64 `protobuf:"varint,12,opt,name=expires,proto3" json:"expires,omitempty"` + // Gives the grantee READ, READ_ACP, and WRITE_ACP permissions on the object. This + // action is not supported by Amazon S3 on Outposts. + GrantFullControl string `protobuf:"bytes,13,opt,name=grant_full_control,json=grantFullControl,proto3" json:"grant_full_control,omitempty"` + // Allows grantee to read the object data and its metadata. This action is not + // supported by Amazon S3 on Outposts. + GrantRead string `protobuf:"bytes,14,opt,name=grant_read,json=grantRead,proto3" json:"grant_read,omitempty"` + // Allows grantee to read the object ACL. This action is not supported by Amazon S3 + // on Outposts. + GrantReadAcp string `protobuf:"bytes,15,opt,name=grant_read_acp,json=grantReadAcp,proto3" json:"grant_read_acp,omitempty"` + // Allows grantee to write the ACL for the applicable object. This action is not + // supported by Amazon S3 on Outposts. + GrantWriteAcp string `protobuf:"bytes,16,opt,name=grant_write_acp,json=grantWriteAcp,proto3" json:"grant_write_acp,omitempty"` + // A map of metadata to store with the object + MetaData map[string]string `protobuf:"bytes,17,rep,name=meta_data,json=metaData,proto3" json:"meta_data,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // Specifies whether you want to apply a legal hold to the uploaded object + ObjectLockLegalHoldStatus string `protobuf:"bytes,18,opt,name=object_lock_legal_hold_status,json=objectLockLegalHoldStatus,proto3" json:"object_lock_legal_hold_status,omitempty"` + // Specifies the Object Lock mode that you want to apply to the uploaded object + ObjectLockMode string `protobuf:"bytes,19,opt,name=object_lock_mode,json=objectLockMode,proto3" json:"object_lock_mode,omitempty"` + // Specifies the date and time when you want the Object Lock to expire + ObjectLockRetainUntilDate int64 `protobuf:"varint,20,opt,name=object_lock_retain_until_date,json=objectLockRetainUntilDate,proto3" json:"object_lock_retain_until_date,omitempty"` + // Confirms that the requester knows that they will be charged for the request + RequestPayer string `protobuf:"bytes,21,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` // Specifies the algorithm to use to when encrypting the object (for example, // AES256). - SseCustomerAlgorithm string `protobuf:"bytes,4,opt,name=sse_customer_algorithm,json=sseCustomerAlgorithm,proto3" json:"sse_customer_algorithm,omitempty"` - // Specifies the 128-bit MD5 digest of the encryption key according to RFC 1321. - SseCustomerKeyMd5 string `protobuf:"bytes,5,opt,name=sse_customer_key_md5,json=sseCustomerKeyMd5,proto3" json:"sse_customer_key_md5,omitempty"` + SseCustomerAlgorithm string `protobuf:"bytes,22,opt,name=sse_customer_algorithm,json=sseCustomerAlgorithm,proto3" json:"sse_customer_algorithm,omitempty"` + // Specifies the customer-provided encryption key to use in encrypting data + SseCustomerKey string `protobuf:"bytes,23,opt,name=sse_customer_key,json=sseCustomerKey,proto3" json:"sse_customer_key,omitempty"` + // Specifies the 128-bit MD5 digest of the encryption key according to RFC 1321 + SseCustomerKeyMd5 string `protobuf:"bytes,24,opt,name=sse_customer_key_md5,json=sseCustomerKeyMd5,proto3" json:"sse_customer_key_md5,omitempty"` + // Specifies the Amazon Web Services KMS Encryption Context to use for object encryption + SseKmsEncryptionContext string `protobuf:"bytes,25,opt,name=sse_kms_encryption_context,json=sseKmsEncryptionContext,proto3" json:"sse_kms_encryption_context,omitempty"` // Specifies the ID of the symmetric customer managed key to use for object encryption - SseKmsKeyId string `protobuf:"bytes,6,opt,name=sse_kms_key_id,json=sseKmsKeyId,proto3" json:"sse_kms_key_id,omitempty"` - // The server-side encryption algorithm used when storing this object in Amazon S3 - // (for example, AES256, aws:kms). - ServerSideEncryption string `protobuf:"bytes,7,opt,name=server_side_encryption,json=serverSideEncryption,proto3" json:"server_side_encryption,omitempty"` + SseKmsKeyId string `protobuf:"bytes,26,opt,name=sse_kms_key_id,json=sseKmsKeyId,proto3" json:"sse_kms_key_id,omitempty"` + // The server-side encryption algorithm used when storing this object + ServerSideEncryption string `protobuf:"bytes,27,opt,name=server_side_encryption,json=serverSideEncryption,proto3" json:"server_side_encryption,omitempty"` + // By default, oss store uses the STANDARD Storage Class to store newly created objects + StorageClass string `protobuf:"bytes,28,opt,name=storage_class,json=storageClass,proto3" json:"storage_class,omitempty"` + // The tag-set for the object. The tag-set must be encoded as URL Query parameters. + Tagging map[string]string `protobuf:"bytes,29,rep,name=tagging,proto3" json:"tagging,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // If the bucket is configured as a website, redirects requests for this object to + // another object in the same bucket or to an external URL. + WebsiteRedirectLocation string `protobuf:"bytes,30,opt,name=website_redirect_location,json=websiteRedirectLocation,proto3" json:"website_redirect_location,omitempty"` } -func (x *UploadPartOutput) Reset() { - *x = UploadPartOutput{} +func (x *CreateMultipartUploadInput) Reset() { + *x = CreateMultipartUploadInput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[34] + mi := &file_oss_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *UploadPartOutput) String() string { +func (x *CreateMultipartUploadInput) String() string { return protoimpl.X.MessageStringOf(x) } -func (*UploadPartOutput) ProtoMessage() {} +func (*CreateMultipartUploadInput) ProtoMessage() {} -func (x *UploadPartOutput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[34] +func (x *CreateMultipartUploadInput) ProtoReflect() protoreflect.Message { + mi := &file_oss_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3565,284 +3627,285 @@ func (x *UploadPartOutput) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use UploadPartOutput.ProtoReflect.Descriptor instead. -func (*UploadPartOutput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{34} +// Deprecated: Use CreateMultipartUploadInput.ProtoReflect.Descriptor instead. +func (*CreateMultipartUploadInput) Descriptor() ([]byte, []int) { + return file_oss_proto_rawDescGZIP(), []int{39} } -func (x *UploadPartOutput) GetBucketKeyEnabled() bool { +func (x *CreateMultipartUploadInput) GetStoreName() string { + if x != nil { + return x.StoreName + } + return "" +} + +func (x *CreateMultipartUploadInput) GetBucket() string { + if x != nil { + return x.Bucket + } + return "" +} + +func (x *CreateMultipartUploadInput) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +func (x *CreateMultipartUploadInput) GetAcl() string { + if x != nil { + return x.Acl + } + return "" +} + +func (x *CreateMultipartUploadInput) GetBucketKeyEnabled() bool { if x != nil { return x.BucketKeyEnabled } return false } -func (x *UploadPartOutput) GetEtag() string { +func (x *CreateMultipartUploadInput) GetCacheControl() string { if x != nil { - return x.Etag + return x.CacheControl } return "" } -func (x *UploadPartOutput) GetRequestCharged() string { +func (x *CreateMultipartUploadInput) GetContentDisposition() string { if x != nil { - return x.RequestCharged + return x.ContentDisposition } return "" } -func (x *UploadPartOutput) GetSseCustomerAlgorithm() string { +func (x *CreateMultipartUploadInput) GetContentEncoding() string { if x != nil { - return x.SseCustomerAlgorithm + return x.ContentEncoding } return "" } -func (x *UploadPartOutput) GetSseCustomerKeyMd5() string { +func (x *CreateMultipartUploadInput) GetContentLanguage() string { if x != nil { - return x.SseCustomerKeyMd5 + return x.ContentLanguage } return "" } -func (x *UploadPartOutput) GetSseKmsKeyId() string { +func (x *CreateMultipartUploadInput) GetContentType() string { if x != nil { - return x.SseKmsKeyId + return x.ContentType } return "" } -func (x *UploadPartOutput) GetServerSideEncryption() string { +func (x *CreateMultipartUploadInput) GetExpectedBucketOwner() string { if x != nil { - return x.ServerSideEncryption + return x.ExpectedBucketOwner } return "" } -// UploadPartCopyInput -type UploadPartCopyInput struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +func (x *CreateMultipartUploadInput) GetExpires() int64 { + if x != nil { + return x.Expires + } + return 0 +} - // Required. The name of oss store. - StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` - // The bucket name containing the object - // This member is required - Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` - // Name of the object key. - // This member is required. - Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` - // CopySource - CopySource *CopySource `protobuf:"bytes,4,opt,name=copy_source,json=copySource,proto3" json:"copy_source,omitempty"` - // Part number of part being copied. This is a positive integer between 1 and 10,000. - // This member is required. - PartNumber int32 `protobuf:"varint,5,opt,name=part_number,json=partNumber,proto3" json:"part_number,omitempty"` - // Upload ID identifying the multipart upload whose part is being copied. - // This member is required. - UploadId string `protobuf:"bytes,6,opt,name=upload_id,json=uploadId,proto3" json:"upload_id,omitempty"` - // The range of bytes to copy from the source object.bytes=start_position-part_size - StartPosition int64 `protobuf:"varint,7,opt,name=start_position,json=startPosition,proto3" json:"start_position,omitempty"` - // Part size - PartSize int64 `protobuf:"varint,8,opt,name=part_size,json=partSize,proto3" json:"part_size,omitempty"` -} - -func (x *UploadPartCopyInput) Reset() { - *x = UploadPartCopyInput{} - if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[35] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *CreateMultipartUploadInput) GetGrantFullControl() string { + if x != nil { + return x.GrantFullControl } + return "" } -func (x *UploadPartCopyInput) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*UploadPartCopyInput) ProtoMessage() {} - -func (x *UploadPartCopyInput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[35] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *CreateMultipartUploadInput) GetGrantRead() string { + if x != nil { + return x.GrantRead } - return mi.MessageOf(x) + return "" } -// Deprecated: Use UploadPartCopyInput.ProtoReflect.Descriptor instead. -func (*UploadPartCopyInput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{35} +func (x *CreateMultipartUploadInput) GetGrantReadAcp() string { + if x != nil { + return x.GrantReadAcp + } + return "" } -func (x *UploadPartCopyInput) GetStoreName() string { +func (x *CreateMultipartUploadInput) GetGrantWriteAcp() string { if x != nil { - return x.StoreName + return x.GrantWriteAcp } return "" } -func (x *UploadPartCopyInput) GetBucket() string { +func (x *CreateMultipartUploadInput) GetMetaData() map[string]string { if x != nil { - return x.Bucket + return x.MetaData } - return "" + return nil } -func (x *UploadPartCopyInput) GetKey() string { +func (x *CreateMultipartUploadInput) GetObjectLockLegalHoldStatus() string { if x != nil { - return x.Key + return x.ObjectLockLegalHoldStatus } return "" } -func (x *UploadPartCopyInput) GetCopySource() *CopySource { +func (x *CreateMultipartUploadInput) GetObjectLockMode() string { if x != nil { - return x.CopySource + return x.ObjectLockMode } - return nil + return "" } -func (x *UploadPartCopyInput) GetPartNumber() int32 { +func (x *CreateMultipartUploadInput) GetObjectLockRetainUntilDate() int64 { if x != nil { - return x.PartNumber + return x.ObjectLockRetainUntilDate } return 0 } -func (x *UploadPartCopyInput) GetUploadId() string { +func (x *CreateMultipartUploadInput) GetRequestPayer() string { if x != nil { - return x.UploadId + return x.RequestPayer } return "" } -func (x *UploadPartCopyInput) GetStartPosition() int64 { +func (x *CreateMultipartUploadInput) GetSseCustomerAlgorithm() string { if x != nil { - return x.StartPosition + return x.SseCustomerAlgorithm } - return 0 + return "" } -func (x *UploadPartCopyInput) GetPartSize() int64 { +func (x *CreateMultipartUploadInput) GetSseCustomerKey() string { if x != nil { - return x.PartSize + return x.SseCustomerKey } - return 0 + return "" } -// CopyPartResult -type CopyPartResult struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Entity tag of the object. - Etag string `protobuf:"bytes,1,opt,name=etag,proto3" json:"etag,omitempty"` - // Last modified time - LastModified int64 `protobuf:"varint,2,opt,name=last_modified,json=lastModified,proto3" json:"last_modified,omitempty"` +func (x *CreateMultipartUploadInput) GetSseCustomerKeyMd5() string { + if x != nil { + return x.SseCustomerKeyMd5 + } + return "" } -func (x *CopyPartResult) Reset() { - *x = CopyPartResult{} - if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[36] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *CreateMultipartUploadInput) GetSseKmsEncryptionContext() string { + if x != nil { + return x.SseKmsEncryptionContext } + return "" } -func (x *CopyPartResult) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *CreateMultipartUploadInput) GetSseKmsKeyId() string { + if x != nil { + return x.SseKmsKeyId + } + return "" } -func (*CopyPartResult) ProtoMessage() {} - -func (x *CopyPartResult) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[36] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *CreateMultipartUploadInput) GetServerSideEncryption() string { + if x != nil { + return x.ServerSideEncryption } - return mi.MessageOf(x) + return "" } -// Deprecated: Use CopyPartResult.ProtoReflect.Descriptor instead. -func (*CopyPartResult) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{36} +func (x *CreateMultipartUploadInput) GetStorageClass() string { + if x != nil { + return x.StorageClass + } + return "" } -func (x *CopyPartResult) GetEtag() string { +func (x *CreateMultipartUploadInput) GetTagging() map[string]string { if x != nil { - return x.Etag + return x.Tagging } - return "" + return nil } -func (x *CopyPartResult) GetLastModified() int64 { +func (x *CreateMultipartUploadInput) GetWebsiteRedirectLocation() string { if x != nil { - return x.LastModified + return x.WebsiteRedirectLocation } - return 0 + return "" } -// UploadPartCopyOutput -type UploadPartCopyOutput struct { +// CreateMultipartUploadOutput +type CreateMultipartUploadOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + // The bucket name containing the object + // This member is required + Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + // Name of the object key. + // This member is required. + Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` + // If the bucket has a lifecycle rule configured with an action to abort incomplete + // multipart uploads and the prefix in the lifecycle rule matches the object name + // in the request, the response includes this header + AbortDate int64 `protobuf:"varint,3,opt,name=abort_date,json=abortDate,proto3" json:"abort_date,omitempty"` + // It identifies the applicable lifecycle configuration rule that defines the action to abort + // incomplete multipart uploads. + AbortRuleId string `protobuf:"bytes,4,opt,name=abort_rule_id,json=abortRuleId,proto3" json:"abort_rule_id,omitempty"` // Indicates whether the multipart upload uses an S3 Bucket Key for server-side // encryption with Amazon Web Services KMS (SSE-KMS). - BucketKeyEnabled bool `protobuf:"varint,1,opt,name=bucket_key_enabled,json=bucketKeyEnabled,proto3" json:"bucket_key_enabled,omitempty"` - // Container for all response elements. - CopyPartResult *CopyPartResult `protobuf:"bytes,2,opt,name=copy_part_result,json=copyPartResult,proto3" json:"copy_part_result,omitempty"` - // The version of the source object that was copied, if you have enabled versioning - // on the source bucket. - CopySourceVersionId string `protobuf:"bytes,3,opt,name=copy_source_version_id,json=copySourceVersionId,proto3" json:"copy_source_version_id,omitempty"` + BucketKeyEnabled bool `protobuf:"varint,5,opt,name=bucket_key_enabled,json=bucketKeyEnabled,proto3" json:"bucket_key_enabled,omitempty"` // If present, indicates that the requester was successfully charged for the // request. - RequestCharged string `protobuf:"bytes,4,opt,name=request_charged,json=requestCharged,proto3" json:"request_charged,omitempty"` + RequestCharged string `protobuf:"bytes,6,opt,name=request_charged,json=requestCharged,proto3" json:"request_charged,omitempty"` // If server-side encryption with a customer-provided encryption key was requested, // the response will include this header confirming the encryption algorithm used. - SseCustomerAlgorithm string `protobuf:"bytes,5,opt,name=sse_customer_algorithm,json=sseCustomerAlgorithm,proto3" json:"sse_customer_algorithm,omitempty"` + SseCustomerAlgorithm string `protobuf:"bytes,7,opt,name=sse_customer_algorithm,json=sseCustomerAlgorithm,proto3" json:"sse_customer_algorithm,omitempty"` // If server-side encryption with a customer-provided encryption key was requested, // the response will include this header to provide round-trip message integrity // verification of the customer-provided encryption key. - SseCustomerKeyMd5 string `protobuf:"bytes,6,opt,name=sse_customer_key_md5,json=sseCustomerKeyMd5,proto3" json:"sse_customer_key_md5,omitempty"` + SseCustomerKeyMd5 string `protobuf:"bytes,8,opt,name=sse_customer_key_md5,json=sseCustomerKeyMd5,proto3" json:"sse_customer_key_md5,omitempty"` + // If present, specifies the Amazon Web Services KMS Encryption Context to use for + // object encryption. The value of this header is a base64-encoded UTF-8 string + // holding JSON with the encryption context key-value pairs. + SseKmsEncryptionContext string `protobuf:"bytes,9,opt,name=sse_kms_encryption_context,json=sseKmsEncryptionContext,proto3" json:"sse_kms_encryption_context,omitempty"` // If present, specifies the ID of the Amazon Web Services Key Management Service // (Amazon Web Services KMS) symmetric customer managed key that was used for the // object. - SseKmsKeyId string `protobuf:"bytes,7,opt,name=sse_kms_key_id,json=sseKmsKeyId,proto3" json:"sse_kms_key_id,omitempty"` + SseKmsKeyId string `protobuf:"bytes,10,opt,name=sse_kms_key_id,json=sseKmsKeyId,proto3" json:"sse_kms_key_id,omitempty"` // The server-side encryption algorithm used when storing this object in Amazon S3 // (for example, AES256, aws:kms). - ServerSideEncryption string `protobuf:"bytes,8,opt,name=server_side_encryption,json=serverSideEncryption,proto3" json:"server_side_encryption,omitempty"` + ServerSideEncryption string `protobuf:"bytes,11,opt,name=server_side_encryption,json=serverSideEncryption,proto3" json:"server_side_encryption,omitempty"` + // ID for the initiated multipart upload. + UploadId string `protobuf:"bytes,12,opt,name=upload_id,json=uploadId,proto3" json:"upload_id,omitempty"` } -func (x *UploadPartCopyOutput) Reset() { - *x = UploadPartCopyOutput{} +func (x *CreateMultipartUploadOutput) Reset() { + *x = CreateMultipartUploadOutput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[37] + mi := &file_oss_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *UploadPartCopyOutput) String() string { +func (x *CreateMultipartUploadOutput) String() string { return protoimpl.X.MessageStringOf(x) } -func (*UploadPartCopyOutput) ProtoMessage() {} +func (*CreateMultipartUploadOutput) ProtoMessage() {} -func (x *UploadPartCopyOutput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[37] +func (x *CreateMultipartUploadOutput) ProtoReflect() protoreflect.Message { + mi := &file_oss_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3853,177 +3916,97 @@ func (x *UploadPartCopyOutput) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use UploadPartCopyOutput.ProtoReflect.Descriptor instead. -func (*UploadPartCopyOutput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{37} +// Deprecated: Use CreateMultipartUploadOutput.ProtoReflect.Descriptor instead. +func (*CreateMultipartUploadOutput) Descriptor() ([]byte, []int) { + return file_oss_proto_rawDescGZIP(), []int{40} } -func (x *UploadPartCopyOutput) GetBucketKeyEnabled() bool { +func (x *CreateMultipartUploadOutput) GetBucket() string { if x != nil { - return x.BucketKeyEnabled + return x.Bucket } - return false + return "" } -func (x *UploadPartCopyOutput) GetCopyPartResult() *CopyPartResult { +func (x *CreateMultipartUploadOutput) GetKey() string { if x != nil { - return x.CopyPartResult + return x.Key } - return nil + return "" } -func (x *UploadPartCopyOutput) GetCopySourceVersionId() string { +func (x *CreateMultipartUploadOutput) GetAbortDate() int64 { if x != nil { - return x.CopySourceVersionId + return x.AbortDate } - return "" + return 0 } -func (x *UploadPartCopyOutput) GetRequestCharged() string { +func (x *CreateMultipartUploadOutput) GetAbortRuleId() string { if x != nil { - return x.RequestCharged + return x.AbortRuleId } return "" } -func (x *UploadPartCopyOutput) GetSseCustomerAlgorithm() string { +func (x *CreateMultipartUploadOutput) GetBucketKeyEnabled() bool { if x != nil { - return x.SseCustomerAlgorithm + return x.BucketKeyEnabled } - return "" + return false } -func (x *UploadPartCopyOutput) GetSseCustomerKeyMd5() string { +func (x *CreateMultipartUploadOutput) GetRequestCharged() string { if x != nil { - return x.SseCustomerKeyMd5 + return x.RequestCharged } return "" } -func (x *UploadPartCopyOutput) GetSseKmsKeyId() string { +func (x *CreateMultipartUploadOutput) GetSseCustomerAlgorithm() string { if x != nil { - return x.SseKmsKeyId + return x.SseCustomerAlgorithm } return "" } -func (x *UploadPartCopyOutput) GetServerSideEncryption() string { +func (x *CreateMultipartUploadOutput) GetSseCustomerKeyMd5() string { if x != nil { - return x.ServerSideEncryption + return x.SseCustomerKeyMd5 } return "" } -// CompletedPart -type CompletedPart struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Entity tag returned when the part was uploaded. - Etag string `protobuf:"bytes,1,opt,name=etag,proto3" json:"etag,omitempty"` - // Part number that identifies the part. This is a positive integer between 1 and - // 10,000. - PartNumber int32 `protobuf:"varint,2,opt,name=part_number,json=partNumber,proto3" json:"part_number,omitempty"` -} - -func (x *CompletedPart) Reset() { - *x = CompletedPart{} - if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[38] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *CompletedPart) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*CompletedPart) ProtoMessage() {} - -func (x *CompletedPart) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[38] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use CompletedPart.ProtoReflect.Descriptor instead. -func (*CompletedPart) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{38} -} - -func (x *CompletedPart) GetEtag() string { +func (x *CreateMultipartUploadOutput) GetSseKmsEncryptionContext() string { if x != nil { - return x.Etag + return x.SseKmsEncryptionContext } return "" } -func (x *CompletedPart) GetPartNumber() int32 { +func (x *CreateMultipartUploadOutput) GetSseKmsKeyId() string { if x != nil { - return x.PartNumber - } - return 0 -} - -// CompletedMultipartUpload -type CompletedMultipartUpload struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Array of CompletedPart data types. - Parts []*CompletedPart `protobuf:"bytes,1,rep,name=parts,proto3" json:"parts,omitempty"` -} - -func (x *CompletedMultipartUpload) Reset() { - *x = CompletedMultipartUpload{} - if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[39] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + return x.SseKmsKeyId } + return "" } -func (x *CompletedMultipartUpload) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*CompletedMultipartUpload) ProtoMessage() {} - -func (x *CompletedMultipartUpload) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[39] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *CreateMultipartUploadOutput) GetServerSideEncryption() string { + if x != nil { + return x.ServerSideEncryption } - return mi.MessageOf(x) -} - -// Deprecated: Use CompletedMultipartUpload.ProtoReflect.Descriptor instead. -func (*CompletedMultipartUpload) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{39} + return "" } -func (x *CompletedMultipartUpload) GetParts() []*CompletedPart { +func (x *CreateMultipartUploadOutput) GetUploadId() string { if x != nil { - return x.Parts + return x.UploadId } - return nil + return "" } -// CompleteMultipartUploadInput -type CompleteMultipartUploadInput struct { +// UploadPartInput +type UploadPartInput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -4036,34 +4019,50 @@ type CompleteMultipartUploadInput struct { // Name of the object key. // This member is required. Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` - // ID for the initiated multipart upload. + // Object data. + Body []byte `protobuf:"bytes,4,opt,name=body,proto3" json:"body,omitempty"` + // Size of the body in bytes. This parameter is useful when the size of the body + // cannot be determined automatically. + ContentLength int64 `protobuf:"varint,5,opt,name=content_length,json=contentLength,proto3" json:"content_length,omitempty"` + // The base64-encoded 128-bit MD5 digest of the part data. + ContentMd5 string `protobuf:"bytes,6,opt,name=content_md5,json=contentMd5,proto3" json:"content_md5,omitempty"` + // The account ID of the expected bucket owner + ExpectedBucketOwner string `protobuf:"bytes,7,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` + // Part number of part being uploaded. This is a positive integer between 1 and 10,000. // This member is required. - UploadId string `protobuf:"bytes,4,opt,name=upload_id,json=uploadId,proto3" json:"upload_id,omitempty"` + PartNumber int32 `protobuf:"varint,8,opt,name=part_number,json=partNumber,proto3" json:"part_number,omitempty"` // Confirms that the requester knows that they will be charged for the request. - RequestPayer string `protobuf:"bytes,5,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` - // Expected bucket owner - ExpectedBucketOwner string `protobuf:"bytes,6,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` - // The container for the multipart upload request information. - MultipartUpload *CompletedMultipartUpload `protobuf:"bytes,7,opt,name=multipart_upload,json=multipartUpload,proto3" json:"multipart_upload,omitempty"` + RequestPayer string `protobuf:"bytes,9,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` + // Specifies the algorithm to use to when encrypting the object (for example, + // AES256). + SseCustomerAlgorithm string `protobuf:"bytes,10,opt,name=sse_customer_algorithm,json=sseCustomerAlgorithm,proto3" json:"sse_customer_algorithm,omitempty"` + // Specifies the customer-provided encryption key for Amazon S3 to use in + // encrypting data + SseCustomerKey string `protobuf:"bytes,11,opt,name=sse_customer_key,json=sseCustomerKey,proto3" json:"sse_customer_key,omitempty"` + // Specifies the 128-bit MD5 digest of the encryption key according to RFC 1321. + SseCustomerKeyMd5 string `protobuf:"bytes,12,opt,name=sse_customer_key_md5,json=sseCustomerKeyMd5,proto3" json:"sse_customer_key_md5,omitempty"` + // Upload ID identifying the multipart upload whose part is being uploaded. + // This member is required. + UploadId string `protobuf:"bytes,13,opt,name=upload_id,json=uploadId,proto3" json:"upload_id,omitempty"` } -func (x *CompleteMultipartUploadInput) Reset() { - *x = CompleteMultipartUploadInput{} +func (x *UploadPartInput) Reset() { + *x = UploadPartInput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[40] + mi := &file_oss_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *CompleteMultipartUploadInput) String() string { +func (x *UploadPartInput) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CompleteMultipartUploadInput) ProtoMessage() {} +func (*UploadPartInput) ProtoMessage() {} -func (x *CompleteMultipartUploadInput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[40] +func (x *UploadPartInput) ProtoReflect() protoreflect.Message { + mi := &file_oss_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4074,114 +4073,145 @@ func (x *CompleteMultipartUploadInput) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use CompleteMultipartUploadInput.ProtoReflect.Descriptor instead. -func (*CompleteMultipartUploadInput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{40} +// Deprecated: Use UploadPartInput.ProtoReflect.Descriptor instead. +func (*UploadPartInput) Descriptor() ([]byte, []int) { + return file_oss_proto_rawDescGZIP(), []int{41} } -func (x *CompleteMultipartUploadInput) GetStoreName() string { +func (x *UploadPartInput) GetStoreName() string { if x != nil { return x.StoreName } return "" } -func (x *CompleteMultipartUploadInput) GetBucket() string { +func (x *UploadPartInput) GetBucket() string { if x != nil { return x.Bucket } return "" } -func (x *CompleteMultipartUploadInput) GetKey() string { +func (x *UploadPartInput) GetKey() string { if x != nil { return x.Key } return "" } -func (x *CompleteMultipartUploadInput) GetUploadId() string { +func (x *UploadPartInput) GetBody() []byte { if x != nil { - return x.UploadId + return x.Body + } + return nil +} + +func (x *UploadPartInput) GetContentLength() int64 { + if x != nil { + return x.ContentLength + } + return 0 +} + +func (x *UploadPartInput) GetContentMd5() string { + if x != nil { + return x.ContentMd5 } return "" } -func (x *CompleteMultipartUploadInput) GetRequestPayer() string { +func (x *UploadPartInput) GetExpectedBucketOwner() string { + if x != nil { + return x.ExpectedBucketOwner + } + return "" +} + +func (x *UploadPartInput) GetPartNumber() int32 { + if x != nil { + return x.PartNumber + } + return 0 +} + +func (x *UploadPartInput) GetRequestPayer() string { if x != nil { return x.RequestPayer } return "" } -func (x *CompleteMultipartUploadInput) GetExpectedBucketOwner() string { +func (x *UploadPartInput) GetSseCustomerAlgorithm() string { if x != nil { - return x.ExpectedBucketOwner + return x.SseCustomerAlgorithm } return "" } -func (x *CompleteMultipartUploadInput) GetMultipartUpload() *CompletedMultipartUpload { +func (x *UploadPartInput) GetSseCustomerKey() string { if x != nil { - return x.MultipartUpload + return x.SseCustomerKey } - return nil + return "" } -// CompleteMultipartUploadOutput -type CompleteMultipartUploadOutput struct { +func (x *UploadPartInput) GetSseCustomerKeyMd5() string { + if x != nil { + return x.SseCustomerKeyMd5 + } + return "" +} + +func (x *UploadPartInput) GetUploadId() string { + if x != nil { + return x.UploadId + } + return "" +} + +// UploadPartOutput +type UploadPartOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // The bucket name containing the object - // This member is required - Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` - // Name of the object key. - // This member is required. - Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` // Indicates whether the multipart upload uses an S3 Bucket Key for server-side // encryption with Amazon Web Services KMS (SSE-KMS). - BucketKeyEnabled bool `protobuf:"varint,3,opt,name=bucket_key_enabled,json=bucketKeyEnabled,proto3" json:"bucket_key_enabled,omitempty"` - // Entity tag that identifies the newly created object's data - Etag string `protobuf:"bytes,4,opt,name=etag,proto3" json:"etag,omitempty"` - // If the object expiration is configured, this will contain the expiration date - // (expiry-date) and rule ID (rule-id). The value of rule-id is URL-encoded. - Expiration string `protobuf:"bytes,5,opt,name=expiration,proto3" json:"expiration,omitempty"` - // The URI that identifies the newly created object. - Location string `protobuf:"bytes,6,opt,name=location,proto3" json:"location,omitempty"` + BucketKeyEnabled bool `protobuf:"varint,1,opt,name=bucket_key_enabled,json=bucketKeyEnabled,proto3" json:"bucket_key_enabled,omitempty"` + // Entity tag for the uploaded object. + Etag string `protobuf:"bytes,2,opt,name=etag,proto3" json:"etag,omitempty"` // If present, indicates that the requester was successfully charged for the // request. - RequestCharged string `protobuf:"bytes,7,opt,name=request_charged,json=requestCharged,proto3" json:"request_charged,omitempty"` - // If present, specifies the ID of the Amazon Web Services Key Management Service - // (Amazon Web Services KMS) symmetric customer managed key that was used for the - // object. - SseKmsKeyId string `protobuf:"bytes,8,opt,name=sse_kms_keyId,json=sseKmsKeyId,proto3" json:"sse_kms_keyId,omitempty"` + RequestCharged string `protobuf:"bytes,3,opt,name=request_charged,json=requestCharged,proto3" json:"request_charged,omitempty"` + // Specifies the algorithm to use to when encrypting the object (for example, + // AES256). + SseCustomerAlgorithm string `protobuf:"bytes,4,opt,name=sse_customer_algorithm,json=sseCustomerAlgorithm,proto3" json:"sse_customer_algorithm,omitempty"` + // Specifies the 128-bit MD5 digest of the encryption key according to RFC 1321. + SseCustomerKeyMd5 string `protobuf:"bytes,5,opt,name=sse_customer_key_md5,json=sseCustomerKeyMd5,proto3" json:"sse_customer_key_md5,omitempty"` + // Specifies the ID of the symmetric customer managed key to use for object encryption + SseKmsKeyId string `protobuf:"bytes,6,opt,name=sse_kms_key_id,json=sseKmsKeyId,proto3" json:"sse_kms_key_id,omitempty"` // The server-side encryption algorithm used when storing this object in Amazon S3 // (for example, AES256, aws:kms). - ServerSideEncryption string `protobuf:"bytes,9,opt,name=server_side_encryption,json=serverSideEncryption,proto3" json:"server_side_encryption,omitempty"` - // Version ID of the newly created object, in case the bucket has versioning turned - // on. - VersionId string `protobuf:"bytes,10,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` + ServerSideEncryption string `protobuf:"bytes,7,opt,name=server_side_encryption,json=serverSideEncryption,proto3" json:"server_side_encryption,omitempty"` } -func (x *CompleteMultipartUploadOutput) Reset() { - *x = CompleteMultipartUploadOutput{} +func (x *UploadPartOutput) Reset() { + *x = UploadPartOutput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[41] + mi := &file_oss_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *CompleteMultipartUploadOutput) String() string { +func (x *UploadPartOutput) String() string { return protoimpl.X.MessageStringOf(x) } -func (*CompleteMultipartUploadOutput) ProtoMessage() {} +func (*UploadPartOutput) ProtoMessage() {} -func (x *CompleteMultipartUploadOutput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[41] +func (x *UploadPartOutput) ProtoReflect() protoreflect.Message { + mi := &file_oss_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4192,83 +4222,62 @@ func (x *CompleteMultipartUploadOutput) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use CompleteMultipartUploadOutput.ProtoReflect.Descriptor instead. -func (*CompleteMultipartUploadOutput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{41} -} - -func (x *CompleteMultipartUploadOutput) GetBucket() string { - if x != nil { - return x.Bucket - } - return "" -} - -func (x *CompleteMultipartUploadOutput) GetKey() string { - if x != nil { - return x.Key - } - return "" +// Deprecated: Use UploadPartOutput.ProtoReflect.Descriptor instead. +func (*UploadPartOutput) Descriptor() ([]byte, []int) { + return file_oss_proto_rawDescGZIP(), []int{42} } -func (x *CompleteMultipartUploadOutput) GetBucketKeyEnabled() bool { +func (x *UploadPartOutput) GetBucketKeyEnabled() bool { if x != nil { return x.BucketKeyEnabled } return false } -func (x *CompleteMultipartUploadOutput) GetEtag() string { +func (x *UploadPartOutput) GetEtag() string { if x != nil { return x.Etag } return "" } -func (x *CompleteMultipartUploadOutput) GetExpiration() string { +func (x *UploadPartOutput) GetRequestCharged() string { if x != nil { - return x.Expiration + return x.RequestCharged } return "" } -func (x *CompleteMultipartUploadOutput) GetLocation() string { +func (x *UploadPartOutput) GetSseCustomerAlgorithm() string { if x != nil { - return x.Location + return x.SseCustomerAlgorithm } return "" } -func (x *CompleteMultipartUploadOutput) GetRequestCharged() string { +func (x *UploadPartOutput) GetSseCustomerKeyMd5() string { if x != nil { - return x.RequestCharged + return x.SseCustomerKeyMd5 } return "" } -func (x *CompleteMultipartUploadOutput) GetSseKmsKeyId() string { +func (x *UploadPartOutput) GetSseKmsKeyId() string { if x != nil { return x.SseKmsKeyId } return "" } -func (x *CompleteMultipartUploadOutput) GetServerSideEncryption() string { +func (x *UploadPartOutput) GetServerSideEncryption() string { if x != nil { return x.ServerSideEncryption } return "" } -func (x *CompleteMultipartUploadOutput) GetVersionId() string { - if x != nil { - return x.VersionId - } - return "" -} - -// AbortMultipartUploadInput -type AbortMultipartUploadInput struct { +// UploadPartCopyInput +type UploadPartCopyInput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -4281,32 +4290,37 @@ type AbortMultipartUploadInput struct { // Name of the object key. // This member is required. Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` - // The account ID of the expected bucket owner - ExpectedBucketOwner string `protobuf:"bytes,4,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` - // Confirms that the requester knows that they will be charged for the request. - RequestPayer string `protobuf:"bytes,5,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` - // Upload ID that identifies the multipart upload. + // CopySource + CopySource *CopySource `protobuf:"bytes,4,opt,name=copy_source,json=copySource,proto3" json:"copy_source,omitempty"` + // Part number of part being copied. This is a positive integer between 1 and 10,000. + // This member is required. + PartNumber int32 `protobuf:"varint,5,opt,name=part_number,json=partNumber,proto3" json:"part_number,omitempty"` + // Upload ID identifying the multipart upload whose part is being copied. // This member is required. UploadId string `protobuf:"bytes,6,opt,name=upload_id,json=uploadId,proto3" json:"upload_id,omitempty"` + // The range of bytes to copy from the source object.bytes=start_position-part_size + StartPosition int64 `protobuf:"varint,7,opt,name=start_position,json=startPosition,proto3" json:"start_position,omitempty"` + // Part size + PartSize int64 `protobuf:"varint,8,opt,name=part_size,json=partSize,proto3" json:"part_size,omitempty"` } -func (x *AbortMultipartUploadInput) Reset() { - *x = AbortMultipartUploadInput{} +func (x *UploadPartCopyInput) Reset() { + *x = UploadPartCopyInput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[42] + mi := &file_oss_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *AbortMultipartUploadInput) String() string { +func (x *UploadPartCopyInput) String() string { return protoimpl.X.MessageStringOf(x) } -func (*AbortMultipartUploadInput) ProtoMessage() {} +func (*UploadPartCopyInput) ProtoMessage() {} -func (x *AbortMultipartUploadInput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[42] +func (x *UploadPartCopyInput) ProtoReflect() protoreflect.Message { + mi := &file_oss_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4317,151 +4331,81 @@ func (x *AbortMultipartUploadInput) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use AbortMultipartUploadInput.ProtoReflect.Descriptor instead. -func (*AbortMultipartUploadInput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{42} +// Deprecated: Use UploadPartCopyInput.ProtoReflect.Descriptor instead. +func (*UploadPartCopyInput) Descriptor() ([]byte, []int) { + return file_oss_proto_rawDescGZIP(), []int{43} } -func (x *AbortMultipartUploadInput) GetStoreName() string { +func (x *UploadPartCopyInput) GetStoreName() string { if x != nil { return x.StoreName } return "" } -func (x *AbortMultipartUploadInput) GetBucket() string { +func (x *UploadPartCopyInput) GetBucket() string { if x != nil { return x.Bucket } return "" } -func (x *AbortMultipartUploadInput) GetKey() string { +func (x *UploadPartCopyInput) GetKey() string { if x != nil { return x.Key } return "" } -func (x *AbortMultipartUploadInput) GetExpectedBucketOwner() string { +func (x *UploadPartCopyInput) GetCopySource() *CopySource { if x != nil { - return x.ExpectedBucketOwner + return x.CopySource } - return "" + return nil } -func (x *AbortMultipartUploadInput) GetRequestPayer() string { +func (x *UploadPartCopyInput) GetPartNumber() int32 { if x != nil { - return x.RequestPayer + return x.PartNumber } - return "" + return 0 } -func (x *AbortMultipartUploadInput) GetUploadId() string { +func (x *UploadPartCopyInput) GetUploadId() string { if x != nil { return x.UploadId } return "" } -// AbortMultipartUploadOutput -type AbortMultipartUploadOutput struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // If present, indicates that the requester was successfully charged for the request. - RequestCharged string `protobuf:"bytes,1,opt,name=request_charged,json=requestCharged,proto3" json:"request_charged,omitempty"` -} - -func (x *AbortMultipartUploadOutput) Reset() { - *x = AbortMultipartUploadOutput{} - if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[43] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *AbortMultipartUploadOutput) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*AbortMultipartUploadOutput) ProtoMessage() {} - -func (x *AbortMultipartUploadOutput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[43] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *UploadPartCopyInput) GetStartPosition() int64 { + if x != nil { + return x.StartPosition } - return mi.MessageOf(x) -} - -// Deprecated: Use AbortMultipartUploadOutput.ProtoReflect.Descriptor instead. -func (*AbortMultipartUploadOutput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{43} + return 0 } -func (x *AbortMultipartUploadOutput) GetRequestCharged() string { +func (x *UploadPartCopyInput) GetPartSize() int64 { if x != nil { - return x.RequestCharged + return x.PartSize } - return "" + return 0 } -// ListMultipartUploadsInput -type ListMultipartUploadsInput struct { +// CopyPartResult +type CopyPartResult struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // Required. The name of oss store. - StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` - // The bucket name containing the object - // This member is required - Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` - // Character you use to group keys. All keys that contain the same string between - // the prefix, if specified, and the first occurrence of the delimiter after the - // prefix are grouped under a single result element, CommonPrefixes. If you don't - // specify the prefix parameter, then the substring starts at the beginning of the - // key. The keys that are grouped under CommonPrefixes result element are not - // returned elsewhere in the response. - Delimiter string `protobuf:"bytes,3,opt,name=delimiter,proto3" json:"delimiter,omitempty"` - // Requests Amazon S3 to encode the object keys in the response and specifies the - // encoding method to use. An object key may contain any Unicode character; - EncodingType string `protobuf:"bytes,4,opt,name=encoding_type,json=encodingType,proto3" json:"encoding_type,omitempty"` - // The account ID of the expected bucket owner - ExpectedBucketOwner string `protobuf:"bytes,5,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` - // Together with upload-id-marker, this parameter specifies the multipart upload - // after which listing should begin. If upload-id-marker is not specified, only the - // keys lexicographically greater than the specified key-marker will be included in - // the list. If upload-id-marker is specified, any multipart uploads for a key - // equal to the key-marker might also be included, provided those multipart uploads - // have upload IDs lexicographically greater than the specified upload-id-marker. - KeyMarker string `protobuf:"bytes,6,opt,name=key_marker,json=keyMarker,proto3" json:"key_marker,omitempty"` - // Sets the maximum number of multipart uploads, from 1 to 1,000, to return in the - // response body. 1,000 is the maximum number of uploads that can be returned in a - // response. - MaxUploads int64 `protobuf:"varint,7,opt,name=max_uploads,json=maxUploads,proto3" json:"max_uploads,omitempty"` - // Lists in-progress uploads only for those keys that begin with the specified - // prefix. You can use prefixes to separate a bucket into different grouping of - // keys. (You can think of using prefix to make groups in the same way you'd use a - // folder in a file system.) - Prefix string `protobuf:"bytes,8,opt,name=prefix,proto3" json:"prefix,omitempty"` - // Together with key-marker, specifies the multipart upload after which listing - // should begin. If key-marker is not specified, the upload-id-marker parameter is - // ignored. Otherwise, any multipart uploads for a key equal to the key-marker - // might be included in the list only if they have an upload ID lexicographically - // greater than the specified upload-id-marker. - UploadIdMarker string `protobuf:"bytes,9,opt,name=upload_id_marker,json=uploadIdMarker,proto3" json:"upload_id_marker,omitempty"` + // Entity tag of the object. + Etag string `protobuf:"bytes,1,opt,name=etag,proto3" json:"etag,omitempty"` + // Last modified time + LastModified int64 `protobuf:"varint,2,opt,name=last_modified,json=lastModified,proto3" json:"last_modified,omitempty"` } -func (x *ListMultipartUploadsInput) Reset() { - *x = ListMultipartUploadsInput{} +func (x *CopyPartResult) Reset() { + *x = CopyPartResult{} if protoimpl.UnsafeEnabled { mi := &file_oss_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -4469,13 +4413,13 @@ func (x *ListMultipartUploadsInput) Reset() { } } -func (x *ListMultipartUploadsInput) String() string { +func (x *CopyPartResult) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListMultipartUploadsInput) ProtoMessage() {} +func (*CopyPartResult) ProtoMessage() {} -func (x *ListMultipartUploadsInput) ProtoReflect() protoreflect.Message { +func (x *CopyPartResult) ProtoReflect() protoreflect.Message { mi := &file_oss_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -4487,103 +4431,176 @@ func (x *ListMultipartUploadsInput) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListMultipartUploadsInput.ProtoReflect.Descriptor instead. -func (*ListMultipartUploadsInput) Descriptor() ([]byte, []int) { +// Deprecated: Use CopyPartResult.ProtoReflect.Descriptor instead. +func (*CopyPartResult) Descriptor() ([]byte, []int) { return file_oss_proto_rawDescGZIP(), []int{44} } -func (x *ListMultipartUploadsInput) GetStoreName() string { +func (x *CopyPartResult) GetEtag() string { if x != nil { - return x.StoreName + return x.Etag } return "" } -func (x *ListMultipartUploadsInput) GetBucket() string { +func (x *CopyPartResult) GetLastModified() int64 { if x != nil { - return x.Bucket + return x.LastModified } - return "" + return 0 } -func (x *ListMultipartUploadsInput) GetDelimiter() string { +// UploadPartCopyOutput +type UploadPartCopyOutput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Indicates whether the multipart upload uses an S3 Bucket Key for server-side + // encryption with Amazon Web Services KMS (SSE-KMS). + BucketKeyEnabled bool `protobuf:"varint,1,opt,name=bucket_key_enabled,json=bucketKeyEnabled,proto3" json:"bucket_key_enabled,omitempty"` + // Container for all response elements. + CopyPartResult *CopyPartResult `protobuf:"bytes,2,opt,name=copy_part_result,json=copyPartResult,proto3" json:"copy_part_result,omitempty"` + // The version of the source object that was copied, if you have enabled versioning + // on the source bucket. + CopySourceVersionId string `protobuf:"bytes,3,opt,name=copy_source_version_id,json=copySourceVersionId,proto3" json:"copy_source_version_id,omitempty"` + // If present, indicates that the requester was successfully charged for the + // request. + RequestCharged string `protobuf:"bytes,4,opt,name=request_charged,json=requestCharged,proto3" json:"request_charged,omitempty"` + // If server-side encryption with a customer-provided encryption key was requested, + // the response will include this header confirming the encryption algorithm used. + SseCustomerAlgorithm string `protobuf:"bytes,5,opt,name=sse_customer_algorithm,json=sseCustomerAlgorithm,proto3" json:"sse_customer_algorithm,omitempty"` + // If server-side encryption with a customer-provided encryption key was requested, + // the response will include this header to provide round-trip message integrity + // verification of the customer-provided encryption key. + SseCustomerKeyMd5 string `protobuf:"bytes,6,opt,name=sse_customer_key_md5,json=sseCustomerKeyMd5,proto3" json:"sse_customer_key_md5,omitempty"` + // If present, specifies the ID of the Amazon Web Services Key Management Service + // (Amazon Web Services KMS) symmetric customer managed key that was used for the + // object. + SseKmsKeyId string `protobuf:"bytes,7,opt,name=sse_kms_key_id,json=sseKmsKeyId,proto3" json:"sse_kms_key_id,omitempty"` + // The server-side encryption algorithm used when storing this object in Amazon S3 + // (for example, AES256, aws:kms). + ServerSideEncryption string `protobuf:"bytes,8,opt,name=server_side_encryption,json=serverSideEncryption,proto3" json:"server_side_encryption,omitempty"` +} + +func (x *UploadPartCopyOutput) Reset() { + *x = UploadPartCopyOutput{} + if protoimpl.UnsafeEnabled { + mi := &file_oss_proto_msgTypes[45] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UploadPartCopyOutput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UploadPartCopyOutput) ProtoMessage() {} + +func (x *UploadPartCopyOutput) ProtoReflect() protoreflect.Message { + mi := &file_oss_proto_msgTypes[45] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UploadPartCopyOutput.ProtoReflect.Descriptor instead. +func (*UploadPartCopyOutput) Descriptor() ([]byte, []int) { + return file_oss_proto_rawDescGZIP(), []int{45} +} + +func (x *UploadPartCopyOutput) GetBucketKeyEnabled() bool { if x != nil { - return x.Delimiter + return x.BucketKeyEnabled } - return "" + return false } -func (x *ListMultipartUploadsInput) GetEncodingType() string { +func (x *UploadPartCopyOutput) GetCopyPartResult() *CopyPartResult { if x != nil { - return x.EncodingType + return x.CopyPartResult + } + return nil +} + +func (x *UploadPartCopyOutput) GetCopySourceVersionId() string { + if x != nil { + return x.CopySourceVersionId } return "" } -func (x *ListMultipartUploadsInput) GetExpectedBucketOwner() string { +func (x *UploadPartCopyOutput) GetRequestCharged() string { if x != nil { - return x.ExpectedBucketOwner + return x.RequestCharged } return "" } -func (x *ListMultipartUploadsInput) GetKeyMarker() string { +func (x *UploadPartCopyOutput) GetSseCustomerAlgorithm() string { if x != nil { - return x.KeyMarker + return x.SseCustomerAlgorithm } return "" } -func (x *ListMultipartUploadsInput) GetMaxUploads() int64 { +func (x *UploadPartCopyOutput) GetSseCustomerKeyMd5() string { if x != nil { - return x.MaxUploads + return x.SseCustomerKeyMd5 } - return 0 + return "" } -func (x *ListMultipartUploadsInput) GetPrefix() string { +func (x *UploadPartCopyOutput) GetSseKmsKeyId() string { if x != nil { - return x.Prefix + return x.SseKmsKeyId } return "" } -func (x *ListMultipartUploadsInput) GetUploadIdMarker() string { +func (x *UploadPartCopyOutput) GetServerSideEncryption() string { if x != nil { - return x.UploadIdMarker + return x.ServerSideEncryption } return "" } -// Initiator -type Initiator struct { +// CompletedPart +type CompletedPart struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // Initiator name - DisplayName string `protobuf:"bytes,1,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` - // Initiator id - Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` + // Entity tag returned when the part was uploaded. + Etag string `protobuf:"bytes,1,opt,name=etag,proto3" json:"etag,omitempty"` + // Part number that identifies the part. This is a positive integer between 1 and + // 10,000. + PartNumber int32 `protobuf:"varint,2,opt,name=part_number,json=partNumber,proto3" json:"part_number,omitempty"` } -func (x *Initiator) Reset() { - *x = Initiator{} +func (x *CompletedPart) Reset() { + *x = CompletedPart{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[45] + mi := &file_oss_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *Initiator) String() string { +func (x *CompletedPart) String() string { return protoimpl.X.MessageStringOf(x) } -func (*Initiator) ProtoMessage() {} +func (*CompletedPart) ProtoMessage() {} -func (x *Initiator) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[45] +func (x *CompletedPart) ProtoReflect() protoreflect.Message { + mi := &file_oss_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4594,63 +4611,52 @@ func (x *Initiator) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use Initiator.ProtoReflect.Descriptor instead. -func (*Initiator) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{45} +// Deprecated: Use CompletedPart.ProtoReflect.Descriptor instead. +func (*CompletedPart) Descriptor() ([]byte, []int) { + return file_oss_proto_rawDescGZIP(), []int{46} } -func (x *Initiator) GetDisplayName() string { +func (x *CompletedPart) GetEtag() string { if x != nil { - return x.DisplayName + return x.Etag } return "" } -func (x *Initiator) GetId() string { +func (x *CompletedPart) GetPartNumber() int32 { if x != nil { - return x.Id + return x.PartNumber } - return "" + return 0 } -// MultipartUpload -type MultipartUpload struct { +// CompletedMultipartUpload +type CompletedMultipartUpload struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // Date and time at which the multipart upload was initiated. - Initiated int64 `protobuf:"varint,1,opt,name=initiated,proto3" json:"initiated,omitempty"` - // Identifies who initiated the multipart upload. - Initiator *Initiator `protobuf:"bytes,2,opt,name=initiator,proto3" json:"initiator,omitempty"` - // Name of the object key. - // This member is required. - Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` - // Specifies the owner of the object that is part of the multipart upload. - Owner *Owner `protobuf:"bytes,4,opt,name=owner,proto3" json:"owner,omitempty"` - // The class of storage used to store the object. - StorageClass string `protobuf:"bytes,5,opt,name=storage_class,json=storageClass,proto3" json:"storage_class,omitempty"` - // Upload ID that identifies the multipart upload. - UploadId string `protobuf:"bytes,6,opt,name=upload_id,json=uploadId,proto3" json:"upload_id,omitempty"` + // Array of CompletedPart data types. + Parts []*CompletedPart `protobuf:"bytes,1,rep,name=parts,proto3" json:"parts,omitempty"` } -func (x *MultipartUpload) Reset() { - *x = MultipartUpload{} +func (x *CompletedMultipartUpload) Reset() { + *x = CompletedMultipartUpload{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[46] + mi := &file_oss_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *MultipartUpload) String() string { +func (x *CompletedMultipartUpload) String() string { return protoimpl.X.MessageStringOf(x) } -func (*MultipartUpload) ProtoMessage() {} +func (*CompletedMultipartUpload) ProtoMessage() {} -func (x *MultipartUpload) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[46] +func (x *CompletedMultipartUpload) ProtoReflect() protoreflect.Message { + mi := &file_oss_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4661,55 +4667,126 @@ func (x *MultipartUpload) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use MultipartUpload.ProtoReflect.Descriptor instead. -func (*MultipartUpload) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{46} -} - -func (x *MultipartUpload) GetInitiated() int64 { - if x != nil { - return x.Initiated - } - return 0 +// Deprecated: Use CompletedMultipartUpload.ProtoReflect.Descriptor instead. +func (*CompletedMultipartUpload) Descriptor() ([]byte, []int) { + return file_oss_proto_rawDescGZIP(), []int{47} } -func (x *MultipartUpload) GetInitiator() *Initiator { +func (x *CompletedMultipartUpload) GetParts() []*CompletedPart { if x != nil { - return x.Initiator + return x.Parts } return nil } -func (x *MultipartUpload) GetKey() string { - if x != nil { - return x.Key - } - return "" +// CompleteMultipartUploadInput +type CompleteMultipartUploadInput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Required. The name of oss store. + StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` + // The bucket name containing the object + // This member is required + Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` + // Name of the object key. + // This member is required. + Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` + // ID for the initiated multipart upload. + // This member is required. + UploadId string `protobuf:"bytes,4,opt,name=upload_id,json=uploadId,proto3" json:"upload_id,omitempty"` + // Confirms that the requester knows that they will be charged for the request. + RequestPayer string `protobuf:"bytes,5,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` + // Expected bucket owner + ExpectedBucketOwner string `protobuf:"bytes,6,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` + // The container for the multipart upload request information. + MultipartUpload *CompletedMultipartUpload `protobuf:"bytes,7,opt,name=multipart_upload,json=multipartUpload,proto3" json:"multipart_upload,omitempty"` } -func (x *MultipartUpload) GetOwner() *Owner { - if x != nil { - return x.Owner +func (x *CompleteMultipartUploadInput) Reset() { + *x = CompleteMultipartUploadInput{} + if protoimpl.UnsafeEnabled { + mi := &file_oss_proto_msgTypes[48] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return nil } -func (x *MultipartUpload) GetStorageClass() string { - if x != nil { - return x.StorageClass - } - return "" +func (x *CompleteMultipartUploadInput) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *MultipartUpload) GetUploadId() string { - if x != nil { - return x.UploadId +func (*CompleteMultipartUploadInput) ProtoMessage() {} + +func (x *CompleteMultipartUploadInput) ProtoReflect() protoreflect.Message { + mi := &file_oss_proto_msgTypes[48] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return "" + return mi.MessageOf(x) } -// ListMultipartUploadsOutput -type ListMultipartUploadsOutput struct { +// Deprecated: Use CompleteMultipartUploadInput.ProtoReflect.Descriptor instead. +func (*CompleteMultipartUploadInput) Descriptor() ([]byte, []int) { + return file_oss_proto_rawDescGZIP(), []int{48} +} + +func (x *CompleteMultipartUploadInput) GetStoreName() string { + if x != nil { + return x.StoreName + } + return "" +} + +func (x *CompleteMultipartUploadInput) GetBucket() string { + if x != nil { + return x.Bucket + } + return "" +} + +func (x *CompleteMultipartUploadInput) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +func (x *CompleteMultipartUploadInput) GetUploadId() string { + if x != nil { + return x.UploadId + } + return "" +} + +func (x *CompleteMultipartUploadInput) GetRequestPayer() string { + if x != nil { + return x.RequestPayer + } + return "" +} + +func (x *CompleteMultipartUploadInput) GetExpectedBucketOwner() string { + if x != nil { + return x.ExpectedBucketOwner + } + return "" +} + +func (x *CompleteMultipartUploadInput) GetMultipartUpload() *CompletedMultipartUpload { + if x != nil { + return x.MultipartUpload + } + return nil +} + +// CompleteMultipartUploadOutput +type CompleteMultipartUploadOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -4717,57 +4794,51 @@ type ListMultipartUploadsOutput struct { // The bucket name containing the object // This member is required Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` - // If you specify a delimiter in the request, then the result returns each distinct - // key prefix containing the delimiter in a CommonPrefixes element. - CommonPrefixes []string `protobuf:"bytes,2,rep,name=common_prefixes,json=commonPrefixes,proto3" json:"common_prefixes,omitempty"` - // Contains the delimiter you specified in the request. If you don't specify a - // delimiter in your request, this element is absent from the response. - Delimiter string `protobuf:"bytes,3,opt,name=delimiter,proto3" json:"delimiter,omitempty"` - // Encoding type used by Amazon S3 to encode object keys in the response. - EncodingType string `protobuf:"bytes,4,opt,name=encoding_type,json=encodingType,proto3" json:"encoding_type,omitempty"` - // Indicates whether the returned list of multipart uploads is truncated. A value - // of true indicates that the list was truncated. The list can be truncated if the - // number of multipart uploads exceeds the limit allowed or specified by max - // uploads. - IsTruncated bool `protobuf:"varint,5,opt,name=is_truncated,json=isTruncated,proto3" json:"is_truncated,omitempty"` - // The key at or after which the listing began. - KeyMarker string `protobuf:"bytes,6,opt,name=key_marker,json=keyMarker,proto3" json:"key_marker,omitempty"` - // Maximum number of multipart uploads that could have been included in the - // response. - MaxUploads int32 `protobuf:"varint,7,opt,name=max_uploads,json=maxUploads,proto3" json:"max_uploads,omitempty"` - // When a list is truncated, this element specifies the value that should be used - // for the key-marker request parameter in a subsequent request. - NextKeyMarker string `protobuf:"bytes,8,opt,name=next_key_marker,json=nextKeyMarker,proto3" json:"next_key_marker,omitempty"` - // When a list is truncated, this element specifies the value that should be used - // for the upload-id-marker request parameter in a subsequent request. - NextUploadIdMarker string `protobuf:"bytes,9,opt,name=next_upload_id_marker,json=nextUploadIdMarker,proto3" json:"next_upload_id_marker,omitempty"` - // When a prefix is provided in the request, this field contains the specified - // prefix. The result contains only keys starting with the specified prefix. - Prefix string `protobuf:"bytes,10,opt,name=prefix,proto3" json:"prefix,omitempty"` - // Upload ID after which listing began. - UploadIdMarker string `protobuf:"bytes,11,opt,name=upload_id_marker,json=uploadIdMarker,proto3" json:"upload_id_marker,omitempty"` - // Container for elements related to a particular multipart upload. A response can - // contain zero or more Upload elements. - Uploads []*MultipartUpload `protobuf:"bytes,12,rep,name=uploads,proto3" json:"uploads,omitempty"` + // Name of the object key. + // This member is required. + Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` + // Indicates whether the multipart upload uses an S3 Bucket Key for server-side + // encryption with Amazon Web Services KMS (SSE-KMS). + BucketKeyEnabled bool `protobuf:"varint,3,opt,name=bucket_key_enabled,json=bucketKeyEnabled,proto3" json:"bucket_key_enabled,omitempty"` + // Entity tag that identifies the newly created object's data + Etag string `protobuf:"bytes,4,opt,name=etag,proto3" json:"etag,omitempty"` + // If the object expiration is configured, this will contain the expiration date + // (expiry-date) and rule ID (rule-id). The value of rule-id is URL-encoded. + Expiration string `protobuf:"bytes,5,opt,name=expiration,proto3" json:"expiration,omitempty"` + // The URI that identifies the newly created object. + Location string `protobuf:"bytes,6,opt,name=location,proto3" json:"location,omitempty"` + // If present, indicates that the requester was successfully charged for the + // request. + RequestCharged string `protobuf:"bytes,7,opt,name=request_charged,json=requestCharged,proto3" json:"request_charged,omitempty"` + // If present, specifies the ID of the Amazon Web Services Key Management Service + // (Amazon Web Services KMS) symmetric customer managed key that was used for the + // object. + SseKmsKeyId string `protobuf:"bytes,8,opt,name=sse_kms_keyId,json=sseKmsKeyId,proto3" json:"sse_kms_keyId,omitempty"` + // The server-side encryption algorithm used when storing this object in Amazon S3 + // (for example, AES256, aws:kms). + ServerSideEncryption string `protobuf:"bytes,9,opt,name=server_side_encryption,json=serverSideEncryption,proto3" json:"server_side_encryption,omitempty"` + // Version ID of the newly created object, in case the bucket has versioning turned + // on. + VersionId string `protobuf:"bytes,10,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` } -func (x *ListMultipartUploadsOutput) Reset() { - *x = ListMultipartUploadsOutput{} +func (x *CompleteMultipartUploadOutput) Reset() { + *x = CompleteMultipartUploadOutput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[47] + mi := &file_oss_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListMultipartUploadsOutput) String() string { +func (x *CompleteMultipartUploadOutput) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListMultipartUploadsOutput) ProtoMessage() {} +func (*CompleteMultipartUploadOutput) ProtoMessage() {} -func (x *ListMultipartUploadsOutput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[47] +func (x *CompleteMultipartUploadOutput) ProtoReflect() protoreflect.Message { + mi := &file_oss_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4778,97 +4849,83 @@ func (x *ListMultipartUploadsOutput) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListMultipartUploadsOutput.ProtoReflect.Descriptor instead. -func (*ListMultipartUploadsOutput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{47} +// Deprecated: Use CompleteMultipartUploadOutput.ProtoReflect.Descriptor instead. +func (*CompleteMultipartUploadOutput) Descriptor() ([]byte, []int) { + return file_oss_proto_rawDescGZIP(), []int{49} } -func (x *ListMultipartUploadsOutput) GetBucket() string { +func (x *CompleteMultipartUploadOutput) GetBucket() string { if x != nil { return x.Bucket } return "" } -func (x *ListMultipartUploadsOutput) GetCommonPrefixes() []string { - if x != nil { - return x.CommonPrefixes - } - return nil -} - -func (x *ListMultipartUploadsOutput) GetDelimiter() string { - if x != nil { - return x.Delimiter - } - return "" -} - -func (x *ListMultipartUploadsOutput) GetEncodingType() string { +func (x *CompleteMultipartUploadOutput) GetKey() string { if x != nil { - return x.EncodingType + return x.Key } return "" } -func (x *ListMultipartUploadsOutput) GetIsTruncated() bool { +func (x *CompleteMultipartUploadOutput) GetBucketKeyEnabled() bool { if x != nil { - return x.IsTruncated + return x.BucketKeyEnabled } return false } -func (x *ListMultipartUploadsOutput) GetKeyMarker() string { +func (x *CompleteMultipartUploadOutput) GetEtag() string { if x != nil { - return x.KeyMarker + return x.Etag } return "" } -func (x *ListMultipartUploadsOutput) GetMaxUploads() int32 { +func (x *CompleteMultipartUploadOutput) GetExpiration() string { if x != nil { - return x.MaxUploads + return x.Expiration } - return 0 + return "" } -func (x *ListMultipartUploadsOutput) GetNextKeyMarker() string { +func (x *CompleteMultipartUploadOutput) GetLocation() string { if x != nil { - return x.NextKeyMarker + return x.Location } return "" } -func (x *ListMultipartUploadsOutput) GetNextUploadIdMarker() string { +func (x *CompleteMultipartUploadOutput) GetRequestCharged() string { if x != nil { - return x.NextUploadIdMarker + return x.RequestCharged } return "" } -func (x *ListMultipartUploadsOutput) GetPrefix() string { +func (x *CompleteMultipartUploadOutput) GetSseKmsKeyId() string { if x != nil { - return x.Prefix + return x.SseKmsKeyId } return "" } -func (x *ListMultipartUploadsOutput) GetUploadIdMarker() string { +func (x *CompleteMultipartUploadOutput) GetServerSideEncryption() string { if x != nil { - return x.UploadIdMarker + return x.ServerSideEncryption } return "" } -func (x *ListMultipartUploadsOutput) GetUploads() []*MultipartUpload { +func (x *CompleteMultipartUploadOutput) GetVersionId() string { if x != nil { - return x.Uploads + return x.VersionId } - return nil + return "" } -// ListObjectVersionsInput -type ListObjectVersionsInput struct { +// AbortMultipartUploadInput +type AbortMultipartUploadInput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -4878,52 +4935,35 @@ type ListObjectVersionsInput struct { // The bucket name containing the object // This member is required Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` - // A delimiter is a character that you specify to group keys. All keys that contain - // the same string between the prefix and the first occurrence of the delimiter are - // grouped under a single result element in CommonPrefixes. These groups are - // counted as one result against the max-keys limitation. These keys are not - // returned elsewhere in the response. - Delimiter string `protobuf:"bytes,3,opt,name=delimiter,proto3" json:"delimiter,omitempty"` - // Requests Amazon S3 to encode the object keys in the response and specifies the - // encoding method to use. An object key may contain any Unicode character; - EncodingType string `protobuf:"bytes,4,opt,name=encoding_type,json=encodingType,proto3" json:"encoding_type,omitempty"` + // Name of the object key. + // This member is required. + Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` // The account ID of the expected bucket owner - ExpectedBucketOwner string `protobuf:"bytes,5,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` - // Specifies the key to start with when listing objects in a bucket. - KeyMarker string `protobuf:"bytes,6,opt,name=key_marker,json=keyMarker,proto3" json:"key_marker,omitempty"` - // Sets the maximum number of keys returned in the response. By default the action - // returns up to 1,000 key names. The response might contain fewer keys but will - // never contain more. If additional keys satisfy the search criteria, but were not - // returned because max-keys was exceeded, the response contains true. To return - // the additional keys, see key-marker and version-id-marker. - MaxKeys int64 `protobuf:"varint,7,opt,name=max_keys,json=maxKeys,proto3" json:"max_keys,omitempty"` - // Use this parameter to select only those keys that begin with the specified - // prefix. You can use prefixes to separate a bucket into different groupings of - // keys. (You can think of using prefix to make groups in the same way you'd use a - // folder in a file system.) You can use prefix with delimiter to roll up numerous - // objects into a single result under CommonPrefixes. - Prefix string `protobuf:"bytes,8,opt,name=prefix,proto3" json:"prefix,omitempty"` - // Specifies the object version you want to start listing from. - VersionIdMarker string `protobuf:"bytes,9,opt,name=version_id_marker,json=versionIdMarker,proto3" json:"version_id_marker,omitempty"` + ExpectedBucketOwner string `protobuf:"bytes,4,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` + // Confirms that the requester knows that they will be charged for the request. + RequestPayer string `protobuf:"bytes,5,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` + // Upload ID that identifies the multipart upload. + // This member is required. + UploadId string `protobuf:"bytes,6,opt,name=upload_id,json=uploadId,proto3" json:"upload_id,omitempty"` } -func (x *ListObjectVersionsInput) Reset() { - *x = ListObjectVersionsInput{} +func (x *AbortMultipartUploadInput) Reset() { + *x = AbortMultipartUploadInput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[48] + mi := &file_oss_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListObjectVersionsInput) String() string { +func (x *AbortMultipartUploadInput) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListObjectVersionsInput) ProtoMessage() {} +func (*AbortMultipartUploadInput) ProtoMessage() {} -func (x *ListObjectVersionsInput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[48] +func (x *AbortMultipartUploadInput) ProtoReflect() protoreflect.Message { + mi := &file_oss_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4934,111 +4974,80 @@ func (x *ListObjectVersionsInput) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListObjectVersionsInput.ProtoReflect.Descriptor instead. -func (*ListObjectVersionsInput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{48} +// Deprecated: Use AbortMultipartUploadInput.ProtoReflect.Descriptor instead. +func (*AbortMultipartUploadInput) Descriptor() ([]byte, []int) { + return file_oss_proto_rawDescGZIP(), []int{50} } -func (x *ListObjectVersionsInput) GetStoreName() string { +func (x *AbortMultipartUploadInput) GetStoreName() string { if x != nil { return x.StoreName } return "" } -func (x *ListObjectVersionsInput) GetBucket() string { +func (x *AbortMultipartUploadInput) GetBucket() string { if x != nil { return x.Bucket } return "" } -func (x *ListObjectVersionsInput) GetDelimiter() string { - if x != nil { - return x.Delimiter - } - return "" -} - -func (x *ListObjectVersionsInput) GetEncodingType() string { +func (x *AbortMultipartUploadInput) GetKey() string { if x != nil { - return x.EncodingType + return x.Key } return "" } -func (x *ListObjectVersionsInput) GetExpectedBucketOwner() string { +func (x *AbortMultipartUploadInput) GetExpectedBucketOwner() string { if x != nil { return x.ExpectedBucketOwner } return "" } -func (x *ListObjectVersionsInput) GetKeyMarker() string { - if x != nil { - return x.KeyMarker - } - return "" -} - -func (x *ListObjectVersionsInput) GetMaxKeys() int64 { - if x != nil { - return x.MaxKeys - } - return 0 -} - -func (x *ListObjectVersionsInput) GetPrefix() string { +func (x *AbortMultipartUploadInput) GetRequestPayer() string { if x != nil { - return x.Prefix + return x.RequestPayer } return "" } -func (x *ListObjectVersionsInput) GetVersionIdMarker() string { +func (x *AbortMultipartUploadInput) GetUploadId() string { if x != nil { - return x.VersionIdMarker + return x.UploadId } return "" } -// DeleteMarkerEntry -type DeleteMarkerEntry struct { +// AbortMultipartUploadOutput +type AbortMultipartUploadOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // Specifies whether the object is (true) or is not (false) the latest version of - // an object. - IsLatest bool `protobuf:"varint,1,opt,name=is_latest,json=isLatest,proto3" json:"is_latest,omitempty"` - // Name of the object key. - // This member is required. - Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` - // Date and time the object was last modified. - LastModified int64 `protobuf:"varint,3,opt,name=last_modified,json=lastModified,proto3" json:"last_modified,omitempty"` - // Owner - Owner *Owner `protobuf:"bytes,4,opt,name=owner,proto3" json:"owner,omitempty"` - // Version ID of an object. - VersionId string `protobuf:"bytes,5,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` + // If present, indicates that the requester was successfully charged for the request. + RequestCharged string `protobuf:"bytes,1,opt,name=request_charged,json=requestCharged,proto3" json:"request_charged,omitempty"` } -func (x *DeleteMarkerEntry) Reset() { - *x = DeleteMarkerEntry{} +func (x *AbortMultipartUploadOutput) Reset() { + *x = AbortMultipartUploadOutput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[49] + mi := &file_oss_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *DeleteMarkerEntry) String() string { +func (x *AbortMultipartUploadOutput) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DeleteMarkerEntry) ProtoMessage() {} +func (*AbortMultipartUploadOutput) ProtoMessage() {} -func (x *DeleteMarkerEntry) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[49] +func (x *AbortMultipartUploadOutput) ProtoReflect() protoreflect.Message { + mi := &file_oss_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5049,89 +5058,82 @@ func (x *DeleteMarkerEntry) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use DeleteMarkerEntry.ProtoReflect.Descriptor instead. -func (*DeleteMarkerEntry) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{49} -} - -func (x *DeleteMarkerEntry) GetIsLatest() bool { - if x != nil { - return x.IsLatest - } - return false -} - -func (x *DeleteMarkerEntry) GetKey() string { - if x != nil { - return x.Key - } - return "" -} - -func (x *DeleteMarkerEntry) GetLastModified() int64 { - if x != nil { - return x.LastModified - } - return 0 -} - -func (x *DeleteMarkerEntry) GetOwner() *Owner { - if x != nil { - return x.Owner - } - return nil +// Deprecated: Use AbortMultipartUploadOutput.ProtoReflect.Descriptor instead. +func (*AbortMultipartUploadOutput) Descriptor() ([]byte, []int) { + return file_oss_proto_rawDescGZIP(), []int{51} } -func (x *DeleteMarkerEntry) GetVersionId() string { +func (x *AbortMultipartUploadOutput) GetRequestCharged() string { if x != nil { - return x.VersionId + return x.RequestCharged } return "" } -// ObjectVersion -type ObjectVersion struct { +// ListMultipartUploadsInput +type ListMultipartUploadsInput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // The entity tag is an MD5 hash of that version of the object. - Etag string `protobuf:"bytes,1,opt,name=etag,proto3" json:"etag,omitempty"` - // Specifies whether the object is (true) or is not (false) the latest version of - // an object. - IsLatest bool `protobuf:"varint,2,opt,name=is_latest,json=isLatest,proto3" json:"is_latest,omitempty"` - // Name of the object key. - // This member is required. - Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` - // Date and time the object was last modified. - LastModified int64 `protobuf:"varint,4,opt,name=last_modified,json=lastModified,proto3" json:"last_modified,omitempty"` - // Specifies the owner of the object. - Owner *Owner `protobuf:"bytes,5,opt,name=owner,proto3" json:"owner,omitempty"` - // Size in bytes of the object. - Size int64 `protobuf:"varint,6,opt,name=size,proto3" json:"size,omitempty"` - // The class of storage used to store the object. - StorageClass string `protobuf:"bytes,7,opt,name=storage_class,json=storageClass,proto3" json:"storage_class,omitempty"` - // Version ID of an object. - VersionId string `protobuf:"bytes,8,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` + // Required. The name of oss store. + StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` + // The bucket name containing the object + // This member is required + Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` + // Character you use to group keys. All keys that contain the same string between + // the prefix, if specified, and the first occurrence of the delimiter after the + // prefix are grouped under a single result element, CommonPrefixes. If you don't + // specify the prefix parameter, then the substring starts at the beginning of the + // key. The keys that are grouped under CommonPrefixes result element are not + // returned elsewhere in the response. + Delimiter string `protobuf:"bytes,3,opt,name=delimiter,proto3" json:"delimiter,omitempty"` + // Requests Amazon S3 to encode the object keys in the response and specifies the + // encoding method to use. An object key may contain any Unicode character; + EncodingType string `protobuf:"bytes,4,opt,name=encoding_type,json=encodingType,proto3" json:"encoding_type,omitempty"` + // The account ID of the expected bucket owner + ExpectedBucketOwner string `protobuf:"bytes,5,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` + // Together with upload-id-marker, this parameter specifies the multipart upload + // after which listing should begin. If upload-id-marker is not specified, only the + // keys lexicographically greater than the specified key-marker will be included in + // the list. If upload-id-marker is specified, any multipart uploads for a key + // equal to the key-marker might also be included, provided those multipart uploads + // have upload IDs lexicographically greater than the specified upload-id-marker. + KeyMarker string `protobuf:"bytes,6,opt,name=key_marker,json=keyMarker,proto3" json:"key_marker,omitempty"` + // Sets the maximum number of multipart uploads, from 1 to 1,000, to return in the + // response body. 1,000 is the maximum number of uploads that can be returned in a + // response. + MaxUploads int64 `protobuf:"varint,7,opt,name=max_uploads,json=maxUploads,proto3" json:"max_uploads,omitempty"` + // Lists in-progress uploads only for those keys that begin with the specified + // prefix. You can use prefixes to separate a bucket into different grouping of + // keys. (You can think of using prefix to make groups in the same way you'd use a + // folder in a file system.) + Prefix string `protobuf:"bytes,8,opt,name=prefix,proto3" json:"prefix,omitempty"` + // Together with key-marker, specifies the multipart upload after which listing + // should begin. If key-marker is not specified, the upload-id-marker parameter is + // ignored. Otherwise, any multipart uploads for a key equal to the key-marker + // might be included in the list only if they have an upload ID lexicographically + // greater than the specified upload-id-marker. + UploadIdMarker string `protobuf:"bytes,9,opt,name=upload_id_marker,json=uploadIdMarker,proto3" json:"upload_id_marker,omitempty"` } -func (x *ObjectVersion) Reset() { - *x = ObjectVersion{} +func (x *ListMultipartUploadsInput) Reset() { + *x = ListMultipartUploadsInput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[50] + mi := &file_oss_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ObjectVersion) String() string { +func (x *ListMultipartUploadsInput) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ObjectVersion) ProtoMessage() {} +func (*ListMultipartUploadsInput) ProtoMessage() {} -func (x *ObjectVersion) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[50] +func (x *ListMultipartUploadsInput) ProtoReflect() protoreflect.Message { + mi := &file_oss_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5142,123 +5144,103 @@ func (x *ObjectVersion) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ObjectVersion.ProtoReflect.Descriptor instead. -func (*ObjectVersion) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{50} +// Deprecated: Use ListMultipartUploadsInput.ProtoReflect.Descriptor instead. +func (*ListMultipartUploadsInput) Descriptor() ([]byte, []int) { + return file_oss_proto_rawDescGZIP(), []int{52} } -func (x *ObjectVersion) GetEtag() string { +func (x *ListMultipartUploadsInput) GetStoreName() string { if x != nil { - return x.Etag + return x.StoreName } return "" } -func (x *ObjectVersion) GetIsLatest() bool { +func (x *ListMultipartUploadsInput) GetBucket() string { if x != nil { - return x.IsLatest + return x.Bucket } - return false + return "" } -func (x *ObjectVersion) GetKey() string { +func (x *ListMultipartUploadsInput) GetDelimiter() string { if x != nil { - return x.Key + return x.Delimiter } return "" } -func (x *ObjectVersion) GetLastModified() int64 { +func (x *ListMultipartUploadsInput) GetEncodingType() string { if x != nil { - return x.LastModified + return x.EncodingType } - return 0 + return "" } -func (x *ObjectVersion) GetOwner() *Owner { +func (x *ListMultipartUploadsInput) GetExpectedBucketOwner() string { if x != nil { - return x.Owner + return x.ExpectedBucketOwner } - return nil + return "" } -func (x *ObjectVersion) GetSize() int64 { +func (x *ListMultipartUploadsInput) GetKeyMarker() string { if x != nil { - return x.Size + return x.KeyMarker + } + return "" +} + +func (x *ListMultipartUploadsInput) GetMaxUploads() int64 { + if x != nil { + return x.MaxUploads } return 0 } -func (x *ObjectVersion) GetStorageClass() string { +func (x *ListMultipartUploadsInput) GetPrefix() string { if x != nil { - return x.StorageClass + return x.Prefix } return "" } -func (x *ObjectVersion) GetVersionId() string { +func (x *ListMultipartUploadsInput) GetUploadIdMarker() string { if x != nil { - return x.VersionId + return x.UploadIdMarker } return "" } -// ListObjectVersionsOutput -type ListObjectVersionsOutput struct { +// Initiator +type Initiator struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // All of the keys rolled up into a common prefix count as a single return when - // calculating the number of returns. - CommonPrefixes []string `protobuf:"bytes,1,rep,name=common_prefixes,json=commonPrefixes,proto3" json:"common_prefixes,omitempty"` - // Container for an object that is a delete marker. - DeleteMarkers []*DeleteMarkerEntry `protobuf:"bytes,2,rep,name=delete_markers,json=deleteMarkers,proto3" json:"delete_markers,omitempty"` - // The delimiter grouping the included keys. - Delimiter string `protobuf:"bytes,3,opt,name=delimiter,proto3" json:"delimiter,omitempty"` - // Encoding type used by Amazon S3 to encode object key names in the XML response. - EncodingType string `protobuf:"bytes,4,opt,name=encoding_type,json=encodingType,proto3" json:"encoding_type,omitempty"` - // A flag that indicates whether Amazon S3 returned all of the results that - // satisfied the search criteria - IsTruncated bool `protobuf:"varint,5,opt,name=is_truncated,json=isTruncated,proto3" json:"is_truncated,omitempty"` - // Marks the last key returned in a truncated response. - KeyMarker string `protobuf:"bytes,6,opt,name=key_marker,json=keyMarker,proto3" json:"key_marker,omitempty"` - // Specifies the maximum number of objects to return - MaxKeys int64 `protobuf:"varint,7,opt,name=max_keys,json=maxKeys,proto3" json:"max_keys,omitempty"` - // The bucket name. - Name string `protobuf:"bytes,8,opt,name=name,proto3" json:"name,omitempty"` - // When the number of responses exceeds the value of MaxKeys, NextKeyMarker - // specifies the first key not returned that satisfies the search criteria - NextKeyMarker string `protobuf:"bytes,9,opt,name=next_key_marker,json=nextKeyMarker,proto3" json:"next_key_marker,omitempty"` - // When the number of responses exceeds the value of MaxKeys, NextVersionIdMarker - // specifies the first object version not returned that satisfies the search - // criteria. - NextVersionIdMarker string `protobuf:"bytes,10,opt,name=next_version_id_marker,json=nextVersionIdMarker,proto3" json:"next_version_id_marker,omitempty"` - // Selects objects that start with the value supplied by this parameter. - Prefix string `protobuf:"bytes,11,opt,name=prefix,proto3" json:"prefix,omitempty"` - // Marks the last version of the key returned in a truncated response. - VersionIdMarker string `protobuf:"bytes,12,opt,name=version_id_marker,json=versionIdMarker,proto3" json:"version_id_marker,omitempty"` - // Container for version information. - Versions []*ObjectVersion `protobuf:"bytes,13,rep,name=versions,proto3" json:"versions,omitempty"` + // Initiator name + DisplayName string `protobuf:"bytes,1,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` + // Initiator id + Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` } -func (x *ListObjectVersionsOutput) Reset() { - *x = ListObjectVersionsOutput{} +func (x *Initiator) Reset() { + *x = Initiator{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[51] + mi := &file_oss_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListObjectVersionsOutput) String() string { +func (x *Initiator) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListObjectVersionsOutput) ProtoMessage() {} +func (*Initiator) ProtoMessage() {} -func (x *ListObjectVersionsOutput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[51] +func (x *Initiator) ProtoReflect() protoreflect.Message { + mi := &file_oss_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5269,169 +5251,180 @@ func (x *ListObjectVersionsOutput) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListObjectVersionsOutput.ProtoReflect.Descriptor instead. -func (*ListObjectVersionsOutput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{51} +// Deprecated: Use Initiator.ProtoReflect.Descriptor instead. +func (*Initiator) Descriptor() ([]byte, []int) { + return file_oss_proto_rawDescGZIP(), []int{53} } -func (x *ListObjectVersionsOutput) GetCommonPrefixes() []string { +func (x *Initiator) GetDisplayName() string { if x != nil { - return x.CommonPrefixes + return x.DisplayName } - return nil + return "" } -func (x *ListObjectVersionsOutput) GetDeleteMarkers() []*DeleteMarkerEntry { +func (x *Initiator) GetId() string { if x != nil { - return x.DeleteMarkers + return x.Id } - return nil + return "" } -func (x *ListObjectVersionsOutput) GetDelimiter() string { - if x != nil { - return x.Delimiter - } - return "" +// MultipartUpload +type MultipartUpload struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Date and time at which the multipart upload was initiated. + Initiated int64 `protobuf:"varint,1,opt,name=initiated,proto3" json:"initiated,omitempty"` + // Identifies who initiated the multipart upload. + Initiator *Initiator `protobuf:"bytes,2,opt,name=initiator,proto3" json:"initiator,omitempty"` + // Name of the object key. + // This member is required. + Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` + // Specifies the owner of the object that is part of the multipart upload. + Owner *Owner `protobuf:"bytes,4,opt,name=owner,proto3" json:"owner,omitempty"` + // The class of storage used to store the object. + StorageClass string `protobuf:"bytes,5,opt,name=storage_class,json=storageClass,proto3" json:"storage_class,omitempty"` + // Upload ID that identifies the multipart upload. + UploadId string `protobuf:"bytes,6,opt,name=upload_id,json=uploadId,proto3" json:"upload_id,omitempty"` } -func (x *ListObjectVersionsOutput) GetEncodingType() string { - if x != nil { - return x.EncodingType +func (x *MultipartUpload) Reset() { + *x = MultipartUpload{} + if protoimpl.UnsafeEnabled { + mi := &file_oss_proto_msgTypes[54] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return "" } -func (x *ListObjectVersionsOutput) GetIsTruncated() bool { - if x != nil { - return x.IsTruncated - } - return false +func (x *MultipartUpload) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *ListObjectVersionsOutput) GetKeyMarker() string { - if x != nil { - return x.KeyMarker +func (*MultipartUpload) ProtoMessage() {} + +func (x *MultipartUpload) ProtoReflect() protoreflect.Message { + mi := &file_oss_proto_msgTypes[54] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return "" + return mi.MessageOf(x) } -func (x *ListObjectVersionsOutput) GetMaxKeys() int64 { - if x != nil { - return x.MaxKeys - } - return 0 +// Deprecated: Use MultipartUpload.ProtoReflect.Descriptor instead. +func (*MultipartUpload) Descriptor() ([]byte, []int) { + return file_oss_proto_rawDescGZIP(), []int{54} } -func (x *ListObjectVersionsOutput) GetName() string { +func (x *MultipartUpload) GetInitiated() int64 { if x != nil { - return x.Name + return x.Initiated } - return "" + return 0 } -func (x *ListObjectVersionsOutput) GetNextKeyMarker() string { +func (x *MultipartUpload) GetInitiator() *Initiator { if x != nil { - return x.NextKeyMarker + return x.Initiator } - return "" + return nil } -func (x *ListObjectVersionsOutput) GetNextVersionIdMarker() string { +func (x *MultipartUpload) GetKey() string { if x != nil { - return x.NextVersionIdMarker + return x.Key } return "" } -func (x *ListObjectVersionsOutput) GetPrefix() string { +func (x *MultipartUpload) GetOwner() *Owner { if x != nil { - return x.Prefix + return x.Owner } - return "" + return nil } -func (x *ListObjectVersionsOutput) GetVersionIdMarker() string { +func (x *MultipartUpload) GetStorageClass() string { if x != nil { - return x.VersionIdMarker + return x.StorageClass } return "" } -func (x *ListObjectVersionsOutput) GetVersions() []*ObjectVersion { +func (x *MultipartUpload) GetUploadId() string { if x != nil { - return x.Versions + return x.UploadId } - return nil + return "" } -// HeadObjectInput -type HeadObjectInput struct { +// ListMultipartUploadsOutput +type ListMultipartUploadsOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // Required. The name of oss store. - StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` // The bucket name containing the object // This member is required - Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` - // Name of the object key. - // This member is required. - Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` - // To retrieve the checksum, this parameter must be enabled - ChecksumMode string `protobuf:"bytes,4,opt,name=checksum_mode,json=checksumMode,proto3" json:"checksum_mode,omitempty"` - // The account ID of the expected bucket owner - ExpectedBucketOwner string `protobuf:"bytes,5,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` - // Return the object only if its entity tag (ETag) is the same as the one - // specified; otherwise, return a 412 (precondition failed) error. - IfMatch string `protobuf:"bytes,6,opt,name=if_match,json=ifMatch,proto3" json:"if_match,omitempty"` - // Return the object only if it has been modified since the specified time; - // otherwise, return a 304 (not modified) error. - IfModifiedSince int64 `protobuf:"varint,7,opt,name=if_modified_since,json=ifModifiedSince,proto3" json:"if_modified_since,omitempty"` - // Return the object only if its entity tag (ETag) is different from the one - // specified - IfNoneMatch string `protobuf:"bytes,8,opt,name=if_none_match,json=ifNoneMatch,proto3" json:"if_none_match,omitempty"` - // Return the object only if it has not been modified since the specified time; - IfUnmodifiedSince int64 `protobuf:"varint,9,opt,name=if_unmodified_since,json=ifUnmodifiedSince,proto3" json:"if_unmodified_since,omitempty"` - // Part number of the object being read. This is a positive integer between 1 and - // 10,000. Effectively performs a 'ranged' HEAD request for the part specified. - // Useful querying about the size of the part and the number of parts in this - // object. - PartNumber int32 `protobuf:"varint,10,opt,name=part_number,json=partNumber,proto3" json:"part_number,omitempty"` - // Confirms that the requester knows that they will be charged for the request. - RequestPayer string `protobuf:"bytes,11,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` - // Specifies the algorithm to use to when encrypting the object (for example, - // AES256). - SseCustomerAlgorithm string `protobuf:"bytes,12,opt,name=sse_customer_algorithm,json=sseCustomerAlgorithm,proto3" json:"sse_customer_algorithm,omitempty"` - // Specifies the customer-provided encryption key for Amazon S3 to use in - // encrypting data - SseCustomerKey string `protobuf:"bytes,13,opt,name=sse_customer_key,json=sseCustomerKey,proto3" json:"sse_customer_key,omitempty"` - // Specifies the 128-bit MD5 digest of the encryption key according to RFC 1321. - SseCustomerKeyMd5 string `protobuf:"bytes,14,opt,name=sse_customer_key_md5,json=sseCustomerKeyMd5,proto3" json:"sse_customer_key_md5,omitempty"` - // VersionId used to reference a specific version of the object. - VersionId string `protobuf:"bytes,15,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` - // Return object details meta - WithDetails bool `protobuf:"varint,16,opt,name=with_details,json=withDetails,proto3" json:"with_details,omitempty"` + Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + // If you specify a delimiter in the request, then the result returns each distinct + // key prefix containing the delimiter in a CommonPrefixes element. + CommonPrefixes []string `protobuf:"bytes,2,rep,name=common_prefixes,json=commonPrefixes,proto3" json:"common_prefixes,omitempty"` + // Contains the delimiter you specified in the request. If you don't specify a + // delimiter in your request, this element is absent from the response. + Delimiter string `protobuf:"bytes,3,opt,name=delimiter,proto3" json:"delimiter,omitempty"` + // Encoding type used by Amazon S3 to encode object keys in the response. + EncodingType string `protobuf:"bytes,4,opt,name=encoding_type,json=encodingType,proto3" json:"encoding_type,omitempty"` + // Indicates whether the returned list of multipart uploads is truncated. A value + // of true indicates that the list was truncated. The list can be truncated if the + // number of multipart uploads exceeds the limit allowed or specified by max + // uploads. + IsTruncated bool `protobuf:"varint,5,opt,name=is_truncated,json=isTruncated,proto3" json:"is_truncated,omitempty"` + // The key at or after which the listing began. + KeyMarker string `protobuf:"bytes,6,opt,name=key_marker,json=keyMarker,proto3" json:"key_marker,omitempty"` + // Maximum number of multipart uploads that could have been included in the + // response. + MaxUploads int32 `protobuf:"varint,7,opt,name=max_uploads,json=maxUploads,proto3" json:"max_uploads,omitempty"` + // When a list is truncated, this element specifies the value that should be used + // for the key-marker request parameter in a subsequent request. + NextKeyMarker string `protobuf:"bytes,8,opt,name=next_key_marker,json=nextKeyMarker,proto3" json:"next_key_marker,omitempty"` + // When a list is truncated, this element specifies the value that should be used + // for the upload-id-marker request parameter in a subsequent request. + NextUploadIdMarker string `protobuf:"bytes,9,opt,name=next_upload_id_marker,json=nextUploadIdMarker,proto3" json:"next_upload_id_marker,omitempty"` + // When a prefix is provided in the request, this field contains the specified + // prefix. The result contains only keys starting with the specified prefix. + Prefix string `protobuf:"bytes,10,opt,name=prefix,proto3" json:"prefix,omitempty"` + // Upload ID after which listing began. + UploadIdMarker string `protobuf:"bytes,11,opt,name=upload_id_marker,json=uploadIdMarker,proto3" json:"upload_id_marker,omitempty"` + // Container for elements related to a particular multipart upload. A response can + // contain zero or more Upload elements. + Uploads []*MultipartUpload `protobuf:"bytes,12,rep,name=uploads,proto3" json:"uploads,omitempty"` } -func (x *HeadObjectInput) Reset() { - *x = HeadObjectInput{} +func (x *ListMultipartUploadsOutput) Reset() { + *x = ListMultipartUploadsOutput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[52] + mi := &file_oss_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *HeadObjectInput) String() string { +func (x *ListMultipartUploadsOutput) String() string { return protoimpl.X.MessageStringOf(x) } -func (*HeadObjectInput) ProtoMessage() {} +func (*ListMultipartUploadsOutput) ProtoMessage() {} -func (x *HeadObjectInput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[52] +func (x *ListMultipartUploadsOutput) ProtoReflect() protoreflect.Message { + mi := &file_oss_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5442,150 +5435,152 @@ func (x *HeadObjectInput) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use HeadObjectInput.ProtoReflect.Descriptor instead. -func (*HeadObjectInput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{52} +// Deprecated: Use ListMultipartUploadsOutput.ProtoReflect.Descriptor instead. +func (*ListMultipartUploadsOutput) Descriptor() ([]byte, []int) { + return file_oss_proto_rawDescGZIP(), []int{55} } -func (x *HeadObjectInput) GetStoreName() string { +func (x *ListMultipartUploadsOutput) GetBucket() string { if x != nil { - return x.StoreName + return x.Bucket } return "" } -func (x *HeadObjectInput) GetBucket() string { +func (x *ListMultipartUploadsOutput) GetCommonPrefixes() []string { if x != nil { - return x.Bucket + return x.CommonPrefixes } - return "" + return nil } -func (x *HeadObjectInput) GetKey() string { +func (x *ListMultipartUploadsOutput) GetDelimiter() string { if x != nil { - return x.Key + return x.Delimiter } return "" } -func (x *HeadObjectInput) GetChecksumMode() string { +func (x *ListMultipartUploadsOutput) GetEncodingType() string { if x != nil { - return x.ChecksumMode + return x.EncodingType } return "" } -func (x *HeadObjectInput) GetExpectedBucketOwner() string { - if x != nil { - return x.ExpectedBucketOwner - } - return "" -} - -func (x *HeadObjectInput) GetIfMatch() string { - if x != nil { - return x.IfMatch - } - return "" -} - -func (x *HeadObjectInput) GetIfModifiedSince() int64 { +func (x *ListMultipartUploadsOutput) GetIsTruncated() bool { if x != nil { - return x.IfModifiedSince + return x.IsTruncated } - return 0 + return false } -func (x *HeadObjectInput) GetIfNoneMatch() string { +func (x *ListMultipartUploadsOutput) GetKeyMarker() string { if x != nil { - return x.IfNoneMatch + return x.KeyMarker } return "" } -func (x *HeadObjectInput) GetIfUnmodifiedSince() int64 { - if x != nil { - return x.IfUnmodifiedSince - } - return 0 -} - -func (x *HeadObjectInput) GetPartNumber() int32 { +func (x *ListMultipartUploadsOutput) GetMaxUploads() int32 { if x != nil { - return x.PartNumber + return x.MaxUploads } return 0 } -func (x *HeadObjectInput) GetRequestPayer() string { - if x != nil { - return x.RequestPayer - } - return "" -} - -func (x *HeadObjectInput) GetSseCustomerAlgorithm() string { +func (x *ListMultipartUploadsOutput) GetNextKeyMarker() string { if x != nil { - return x.SseCustomerAlgorithm + return x.NextKeyMarker } return "" } -func (x *HeadObjectInput) GetSseCustomerKey() string { +func (x *ListMultipartUploadsOutput) GetNextUploadIdMarker() string { if x != nil { - return x.SseCustomerKey + return x.NextUploadIdMarker } return "" } -func (x *HeadObjectInput) GetSseCustomerKeyMd5() string { +func (x *ListMultipartUploadsOutput) GetPrefix() string { if x != nil { - return x.SseCustomerKeyMd5 + return x.Prefix } return "" } -func (x *HeadObjectInput) GetVersionId() string { +func (x *ListMultipartUploadsOutput) GetUploadIdMarker() string { if x != nil { - return x.VersionId + return x.UploadIdMarker } return "" } -func (x *HeadObjectInput) GetWithDetails() bool { +func (x *ListMultipartUploadsOutput) GetUploads() []*MultipartUpload { if x != nil { - return x.WithDetails + return x.Uploads } - return false + return nil } -// HeadObjectOutput -type HeadObjectOutput struct { +// ListObjectVersionsInput +type ListObjectVersionsInput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // Metadata pertaining to the operation's result. - ResultMetadata map[string]string `protobuf:"bytes,1,rep,name=result_metadata,json=resultMetadata,proto3" json:"result_metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // Required. The name of oss store. + StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` + // The bucket name containing the object + // This member is required + Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` + // A delimiter is a character that you specify to group keys. All keys that contain + // the same string between the prefix and the first occurrence of the delimiter are + // grouped under a single result element in CommonPrefixes. These groups are + // counted as one result against the max-keys limitation. These keys are not + // returned elsewhere in the response. + Delimiter string `protobuf:"bytes,3,opt,name=delimiter,proto3" json:"delimiter,omitempty"` + // Requests Amazon S3 to encode the object keys in the response and specifies the + // encoding method to use. An object key may contain any Unicode character; + EncodingType string `protobuf:"bytes,4,opt,name=encoding_type,json=encodingType,proto3" json:"encoding_type,omitempty"` + // The account ID of the expected bucket owner + ExpectedBucketOwner string `protobuf:"bytes,5,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` + // Specifies the key to start with when listing objects in a bucket. + KeyMarker string `protobuf:"bytes,6,opt,name=key_marker,json=keyMarker,proto3" json:"key_marker,omitempty"` + // Sets the maximum number of keys returned in the response. By default the action + // returns up to 1,000 key names. The response might contain fewer keys but will + // never contain more. If additional keys satisfy the search criteria, but were not + // returned because max-keys was exceeded, the response contains true. To return + // the additional keys, see key-marker and version-id-marker. + MaxKeys int64 `protobuf:"varint,7,opt,name=max_keys,json=maxKeys,proto3" json:"max_keys,omitempty"` + // Use this parameter to select only those keys that begin with the specified + // prefix. You can use prefixes to separate a bucket into different groupings of + // keys. (You can think of using prefix to make groups in the same way you'd use a + // folder in a file system.) You can use prefix with delimiter to roll up numerous + // objects into a single result under CommonPrefixes. + Prefix string `protobuf:"bytes,8,opt,name=prefix,proto3" json:"prefix,omitempty"` + // Specifies the object version you want to start listing from. + VersionIdMarker string `protobuf:"bytes,9,opt,name=version_id_marker,json=versionIdMarker,proto3" json:"version_id_marker,omitempty"` } -func (x *HeadObjectOutput) Reset() { - *x = HeadObjectOutput{} +func (x *ListObjectVersionsInput) Reset() { + *x = ListObjectVersionsInput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[53] + mi := &file_oss_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *HeadObjectOutput) String() string { +func (x *ListObjectVersionsInput) String() string { return protoimpl.X.MessageStringOf(x) } -func (*HeadObjectOutput) ProtoMessage() {} +func (*ListObjectVersionsInput) ProtoMessage() {} -func (x *HeadObjectOutput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[53] +func (x *ListObjectVersionsInput) ProtoReflect() protoreflect.Message { + mi := &file_oss_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5596,123 +5591,111 @@ func (x *HeadObjectOutput) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use HeadObjectOutput.ProtoReflect.Descriptor instead. -func (*HeadObjectOutput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{53} +// Deprecated: Use ListObjectVersionsInput.ProtoReflect.Descriptor instead. +func (*ListObjectVersionsInput) Descriptor() ([]byte, []int) { + return file_oss_proto_rawDescGZIP(), []int{56} } -func (x *HeadObjectOutput) GetResultMetadata() map[string]string { +func (x *ListObjectVersionsInput) GetStoreName() string { if x != nil { - return x.ResultMetadata + return x.StoreName } - return nil -} - -// IsObjectExistInput -type IsObjectExistInput struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Required. The name of oss store. - StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` - // The bucket name containing the object - // This member is required - Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` - // Name of the object key. - // This member is required. - Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` - // Object version id - VersionId string `protobuf:"bytes,4,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` + return "" } -func (x *IsObjectExistInput) Reset() { - *x = IsObjectExistInput{} - if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[54] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *ListObjectVersionsInput) GetBucket() string { + if x != nil { + return x.Bucket } + return "" } -func (x *IsObjectExistInput) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *ListObjectVersionsInput) GetDelimiter() string { + if x != nil { + return x.Delimiter + } + return "" } -func (*IsObjectExistInput) ProtoMessage() {} - -func (x *IsObjectExistInput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[54] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *ListObjectVersionsInput) GetEncodingType() string { + if x != nil { + return x.EncodingType } - return mi.MessageOf(x) + return "" } -// Deprecated: Use IsObjectExistInput.ProtoReflect.Descriptor instead. -func (*IsObjectExistInput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{54} +func (x *ListObjectVersionsInput) GetExpectedBucketOwner() string { + if x != nil { + return x.ExpectedBucketOwner + } + return "" } -func (x *IsObjectExistInput) GetStoreName() string { +func (x *ListObjectVersionsInput) GetKeyMarker() string { if x != nil { - return x.StoreName + return x.KeyMarker } return "" } -func (x *IsObjectExistInput) GetBucket() string { +func (x *ListObjectVersionsInput) GetMaxKeys() int64 { if x != nil { - return x.Bucket + return x.MaxKeys } - return "" + return 0 } -func (x *IsObjectExistInput) GetKey() string { +func (x *ListObjectVersionsInput) GetPrefix() string { if x != nil { - return x.Key + return x.Prefix } return "" } -func (x *IsObjectExistInput) GetVersionId() string { +func (x *ListObjectVersionsInput) GetVersionIdMarker() string { if x != nil { - return x.VersionId + return x.VersionIdMarker } return "" } -// IsObjectExistOutput -type IsObjectExistOutput struct { +// DeleteMarkerEntry +type DeleteMarkerEntry struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // Object exist or not - FileExist bool `protobuf:"varint,1,opt,name=file_exist,json=fileExist,proto3" json:"file_exist,omitempty"` + // Specifies whether the object is (true) or is not (false) the latest version of + // an object. + IsLatest bool `protobuf:"varint,1,opt,name=is_latest,json=isLatest,proto3" json:"is_latest,omitempty"` + // Name of the object key. + // This member is required. + Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` + // Date and time the object was last modified. + LastModified int64 `protobuf:"varint,3,opt,name=last_modified,json=lastModified,proto3" json:"last_modified,omitempty"` + // Owner + Owner *Owner `protobuf:"bytes,4,opt,name=owner,proto3" json:"owner,omitempty"` + // Version ID of an object. + VersionId string `protobuf:"bytes,5,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` } -func (x *IsObjectExistOutput) Reset() { - *x = IsObjectExistOutput{} +func (x *DeleteMarkerEntry) Reset() { + *x = DeleteMarkerEntry{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[55] + mi := &file_oss_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *IsObjectExistOutput) String() string { +func (x *DeleteMarkerEntry) String() string { return protoimpl.X.MessageStringOf(x) } -func (*IsObjectExistOutput) ProtoMessage() {} +func (*DeleteMarkerEntry) ProtoMessage() {} -func (x *IsObjectExistOutput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[55] +func (x *DeleteMarkerEntry) ProtoReflect() protoreflect.Message { + mi := &file_oss_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5723,55 +5706,89 @@ func (x *IsObjectExistOutput) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use IsObjectExistOutput.ProtoReflect.Descriptor instead. -func (*IsObjectExistOutput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{55} +// Deprecated: Use DeleteMarkerEntry.ProtoReflect.Descriptor instead. +func (*DeleteMarkerEntry) Descriptor() ([]byte, []int) { + return file_oss_proto_rawDescGZIP(), []int{57} } -func (x *IsObjectExistOutput) GetFileExist() bool { +func (x *DeleteMarkerEntry) GetIsLatest() bool { if x != nil { - return x.FileExist + return x.IsLatest } return false } -// SignURLInput -type SignURLInput struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Required. The name of oss store. - StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` - // The bucket name containing the object - // This member is required - Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` +func (x *DeleteMarkerEntry) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +func (x *DeleteMarkerEntry) GetLastModified() int64 { + if x != nil { + return x.LastModified + } + return 0 +} + +func (x *DeleteMarkerEntry) GetOwner() *Owner { + if x != nil { + return x.Owner + } + return nil +} + +func (x *DeleteMarkerEntry) GetVersionId() string { + if x != nil { + return x.VersionId + } + return "" +} + +// ObjectVersion +type ObjectVersion struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The entity tag is an MD5 hash of that version of the object. + Etag string `protobuf:"bytes,1,opt,name=etag,proto3" json:"etag,omitempty"` + // Specifies whether the object is (true) or is not (false) the latest version of + // an object. + IsLatest bool `protobuf:"varint,2,opt,name=is_latest,json=isLatest,proto3" json:"is_latest,omitempty"` // Name of the object key. // This member is required. Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` - // the method for sign url, eg. GET、POST - Method string `protobuf:"bytes,4,opt,name=method,proto3" json:"method,omitempty"` - // expire time of the sign url - ExpiredInSec int64 `protobuf:"varint,5,opt,name=expired_in_sec,json=expiredInSec,proto3" json:"expired_in_sec,omitempty"` + // Date and time the object was last modified. + LastModified int64 `protobuf:"varint,4,opt,name=last_modified,json=lastModified,proto3" json:"last_modified,omitempty"` + // Specifies the owner of the object. + Owner *Owner `protobuf:"bytes,5,opt,name=owner,proto3" json:"owner,omitempty"` + // Size in bytes of the object. + Size int64 `protobuf:"varint,6,opt,name=size,proto3" json:"size,omitempty"` + // The class of storage used to store the object. + StorageClass string `protobuf:"bytes,7,opt,name=storage_class,json=storageClass,proto3" json:"storage_class,omitempty"` + // Version ID of an object. + VersionId string `protobuf:"bytes,8,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` } -func (x *SignURLInput) Reset() { - *x = SignURLInput{} +func (x *ObjectVersion) Reset() { + *x = ObjectVersion{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[56] + mi := &file_oss_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *SignURLInput) String() string { +func (x *ObjectVersion) String() string { return protoimpl.X.MessageStringOf(x) } -func (*SignURLInput) ProtoMessage() {} +func (*ObjectVersion) ProtoMessage() {} -func (x *SignURLInput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[56] +func (x *ObjectVersion) ProtoReflect() protoreflect.Message { + mi := &file_oss_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5782,73 +5799,123 @@ func (x *SignURLInput) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use SignURLInput.ProtoReflect.Descriptor instead. -func (*SignURLInput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{56} +// Deprecated: Use ObjectVersion.ProtoReflect.Descriptor instead. +func (*ObjectVersion) Descriptor() ([]byte, []int) { + return file_oss_proto_rawDescGZIP(), []int{58} } -func (x *SignURLInput) GetStoreName() string { +func (x *ObjectVersion) GetEtag() string { if x != nil { - return x.StoreName + return x.Etag } return "" } -func (x *SignURLInput) GetBucket() string { +func (x *ObjectVersion) GetIsLatest() bool { if x != nil { - return x.Bucket + return x.IsLatest } - return "" + return false } -func (x *SignURLInput) GetKey() string { +func (x *ObjectVersion) GetKey() string { if x != nil { return x.Key } return "" } -func (x *SignURLInput) GetMethod() string { +func (x *ObjectVersion) GetLastModified() int64 { if x != nil { - return x.Method + return x.LastModified } - return "" + return 0 } -func (x *SignURLInput) GetExpiredInSec() int64 { +func (x *ObjectVersion) GetOwner() *Owner { if x != nil { - return x.ExpiredInSec + return x.Owner + } + return nil +} + +func (x *ObjectVersion) GetSize() int64 { + if x != nil { + return x.Size } return 0 } -// SignURLOutput -type SignURLOutput struct { +func (x *ObjectVersion) GetStorageClass() string { + if x != nil { + return x.StorageClass + } + return "" +} + +func (x *ObjectVersion) GetVersionId() string { + if x != nil { + return x.VersionId + } + return "" +} + +// ListObjectVersionsOutput +type ListObjectVersionsOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // Object signed url - SignedUrl string `protobuf:"bytes,1,opt,name=signed_url,json=signedUrl,proto3" json:"signed_url,omitempty"` + // All of the keys rolled up into a common prefix count as a single return when + // calculating the number of returns. + CommonPrefixes []string `protobuf:"bytes,1,rep,name=common_prefixes,json=commonPrefixes,proto3" json:"common_prefixes,omitempty"` + // Container for an object that is a delete marker. + DeleteMarkers []*DeleteMarkerEntry `protobuf:"bytes,2,rep,name=delete_markers,json=deleteMarkers,proto3" json:"delete_markers,omitempty"` + // The delimiter grouping the included keys. + Delimiter string `protobuf:"bytes,3,opt,name=delimiter,proto3" json:"delimiter,omitempty"` + // Encoding type used by Amazon S3 to encode object key names in the XML response. + EncodingType string `protobuf:"bytes,4,opt,name=encoding_type,json=encodingType,proto3" json:"encoding_type,omitempty"` + // A flag that indicates whether Amazon S3 returned all of the results that + // satisfied the search criteria + IsTruncated bool `protobuf:"varint,5,opt,name=is_truncated,json=isTruncated,proto3" json:"is_truncated,omitempty"` + // Marks the last key returned in a truncated response. + KeyMarker string `protobuf:"bytes,6,opt,name=key_marker,json=keyMarker,proto3" json:"key_marker,omitempty"` + // Specifies the maximum number of objects to return + MaxKeys int64 `protobuf:"varint,7,opt,name=max_keys,json=maxKeys,proto3" json:"max_keys,omitempty"` + // The bucket name. + Name string `protobuf:"bytes,8,opt,name=name,proto3" json:"name,omitempty"` + // When the number of responses exceeds the value of MaxKeys, NextKeyMarker + // specifies the first key not returned that satisfies the search criteria + NextKeyMarker string `protobuf:"bytes,9,opt,name=next_key_marker,json=nextKeyMarker,proto3" json:"next_key_marker,omitempty"` + // When the number of responses exceeds the value of MaxKeys, NextVersionIdMarker + // specifies the first object version not returned that satisfies the search + // criteria. + NextVersionIdMarker string `protobuf:"bytes,10,opt,name=next_version_id_marker,json=nextVersionIdMarker,proto3" json:"next_version_id_marker,omitempty"` + // Selects objects that start with the value supplied by this parameter. + Prefix string `protobuf:"bytes,11,opt,name=prefix,proto3" json:"prefix,omitempty"` + // Marks the last version of the key returned in a truncated response. + VersionIdMarker string `protobuf:"bytes,12,opt,name=version_id_marker,json=versionIdMarker,proto3" json:"version_id_marker,omitempty"` + // Container for version information. + Versions []*ObjectVersion `protobuf:"bytes,13,rep,name=versions,proto3" json:"versions,omitempty"` } -func (x *SignURLOutput) Reset() { - *x = SignURLOutput{} +func (x *ListObjectVersionsOutput) Reset() { + *x = ListObjectVersionsOutput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[57] + mi := &file_oss_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *SignURLOutput) String() string { +func (x *ListObjectVersionsOutput) String() string { return protoimpl.X.MessageStringOf(x) } -func (*SignURLOutput) ProtoMessage() {} +func (*ListObjectVersionsOutput) ProtoMessage() {} -func (x *SignURLOutput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[57] +func (x *ListObjectVersionsOutput) ProtoReflect() protoreflect.Message { + mi := &file_oss_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5859,87 +5926,104 @@ func (x *SignURLOutput) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use SignURLOutput.ProtoReflect.Descriptor instead. -func (*SignURLOutput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{57} +// Deprecated: Use ListObjectVersionsOutput.ProtoReflect.Descriptor instead. +func (*ListObjectVersionsOutput) Descriptor() ([]byte, []int) { + return file_oss_proto_rawDescGZIP(), []int{59} } -func (x *SignURLOutput) GetSignedUrl() string { +func (x *ListObjectVersionsOutput) GetCommonPrefixes() []string { if x != nil { - return x.SignedUrl + return x.CommonPrefixes } - return "" + return nil } -// UpdateBandwidthRateLimitInput -type UpdateBandwidthRateLimitInput struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Required. The name of oss store. - StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` - // The average upload/download bandwidth rate limit in bits per second. - AverageRateLimitInBitsPerSec int64 `protobuf:"varint,2,opt,name=average_rate_limit_in_bits_per_sec,json=averageRateLimitInBitsPerSec,proto3" json:"average_rate_limit_in_bits_per_sec,omitempty"` - // Resource name of gateway - GatewayResourceName string `protobuf:"bytes,3,opt,name=gateway_resource_name,json=gatewayResourceName,proto3" json:"gateway_resource_name,omitempty"` +func (x *ListObjectVersionsOutput) GetDeleteMarkers() []*DeleteMarkerEntry { + if x != nil { + return x.DeleteMarkers + } + return nil } -func (x *UpdateBandwidthRateLimitInput) Reset() { - *x = UpdateBandwidthRateLimitInput{} - if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[58] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *ListObjectVersionsOutput) GetDelimiter() string { + if x != nil { + return x.Delimiter } + return "" } -func (x *UpdateBandwidthRateLimitInput) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *ListObjectVersionsOutput) GetEncodingType() string { + if x != nil { + return x.EncodingType + } + return "" } -func (*UpdateBandwidthRateLimitInput) ProtoMessage() {} +func (x *ListObjectVersionsOutput) GetIsTruncated() bool { + if x != nil { + return x.IsTruncated + } + return false +} -func (x *UpdateBandwidthRateLimitInput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[58] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *ListObjectVersionsOutput) GetKeyMarker() string { + if x != nil { + return x.KeyMarker } - return mi.MessageOf(x) + return "" } -// Deprecated: Use UpdateBandwidthRateLimitInput.ProtoReflect.Descriptor instead. -func (*UpdateBandwidthRateLimitInput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{58} +func (x *ListObjectVersionsOutput) GetMaxKeys() int64 { + if x != nil { + return x.MaxKeys + } + return 0 } -func (x *UpdateBandwidthRateLimitInput) GetStoreName() string { +func (x *ListObjectVersionsOutput) GetName() string { if x != nil { - return x.StoreName + return x.Name } return "" } -func (x *UpdateBandwidthRateLimitInput) GetAverageRateLimitInBitsPerSec() int64 { +func (x *ListObjectVersionsOutput) GetNextKeyMarker() string { if x != nil { - return x.AverageRateLimitInBitsPerSec + return x.NextKeyMarker } - return 0 + return "" } -func (x *UpdateBandwidthRateLimitInput) GetGatewayResourceName() string { +func (x *ListObjectVersionsOutput) GetNextVersionIdMarker() string { if x != nil { - return x.GatewayResourceName + return x.NextVersionIdMarker } return "" } -// AppendObjectInput -type AppendObjectInput struct { +func (x *ListObjectVersionsOutput) GetPrefix() string { + if x != nil { + return x.Prefix + } + return "" +} + +func (x *ListObjectVersionsOutput) GetVersionIdMarker() string { + if x != nil { + return x.VersionIdMarker + } + return "" +} + +func (x *ListObjectVersionsOutput) GetVersions() []*ObjectVersion { + if x != nil { + return x.Versions + } + return nil +} + +// HeadObjectInput +type HeadObjectInput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -5952,51 +6036,59 @@ type AppendObjectInput struct { // Name of the object key. // This member is required. Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` - // Object content - Body []byte `protobuf:"bytes,4,opt,name=body,proto3" json:"body,omitempty"` - // Append start position - Position int64 `protobuf:"varint,5,opt,name=position,proto3" json:"position,omitempty"` - // Object ACL - Acl string `protobuf:"bytes,6,opt,name=acl,proto3" json:"acl,omitempty"` - // Sets the Cache-Control header of the response. - CacheControl string `protobuf:"bytes,7,opt,name=cache_control,json=cacheControl,proto3" json:"cache_control,omitempty"` - // Sets the Content-Disposition header of the response - ContentDisposition string `protobuf:"bytes,8,opt,name=content_disposition,json=contentDisposition,proto3" json:"content_disposition,omitempty"` - // Sets the Content-Encoding header of the response - ContentEncoding string `protobuf:"bytes,9,opt,name=content_encoding,json=contentEncoding,proto3" json:"content_encoding,omitempty"` - // The base64-encoded 128-bit MD5 digest of the part data. - ContentMd5 string `protobuf:"bytes,10,opt,name=content_md5,json=contentMd5,proto3" json:"content_md5,omitempty"` - // Sets the Expires header of the response - Expires int64 `protobuf:"varint,11,opt,name=expires,proto3" json:"expires,omitempty"` - // Provides storage class information of the object. Amazon S3 returns this header - // for all objects except for S3 Standard storage class objects. - StorageClass string `protobuf:"bytes,12,opt,name=storage_class,json=storageClass,proto3" json:"storage_class,omitempty"` - // The server-side encryption algorithm used when storing this object in Amazon S3 - // (for example, AES256, aws:kms). - ServerSideEncryption string `protobuf:"bytes,13,opt,name=server_side_encryption,json=serverSideEncryption,proto3" json:"server_side_encryption,omitempty"` - // Object metadata - Meta string `protobuf:"bytes,14,opt,name=meta,proto3" json:"meta,omitempty"` - // Object tags - Tags map[string]string `protobuf:"bytes,15,rep,name=tags,proto3" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // To retrieve the checksum, this parameter must be enabled + ChecksumMode string `protobuf:"bytes,4,opt,name=checksum_mode,json=checksumMode,proto3" json:"checksum_mode,omitempty"` + // The account ID of the expected bucket owner + ExpectedBucketOwner string `protobuf:"bytes,5,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` + // Return the object only if its entity tag (ETag) is the same as the one + // specified; otherwise, return a 412 (precondition failed) error. + IfMatch string `protobuf:"bytes,6,opt,name=if_match,json=ifMatch,proto3" json:"if_match,omitempty"` + // Return the object only if it has been modified since the specified time; + // otherwise, return a 304 (not modified) error. + IfModifiedSince int64 `protobuf:"varint,7,opt,name=if_modified_since,json=ifModifiedSince,proto3" json:"if_modified_since,omitempty"` + // Return the object only if its entity tag (ETag) is different from the one + // specified + IfNoneMatch string `protobuf:"bytes,8,opt,name=if_none_match,json=ifNoneMatch,proto3" json:"if_none_match,omitempty"` + // Return the object only if it has not been modified since the specified time; + IfUnmodifiedSince int64 `protobuf:"varint,9,opt,name=if_unmodified_since,json=ifUnmodifiedSince,proto3" json:"if_unmodified_since,omitempty"` + // Part number of the object being read. This is a positive integer between 1 and + // 10,000. Effectively performs a 'ranged' HEAD request for the part specified. + // Useful querying about the size of the part and the number of parts in this + // object. + PartNumber int32 `protobuf:"varint,10,opt,name=part_number,json=partNumber,proto3" json:"part_number,omitempty"` + // Confirms that the requester knows that they will be charged for the request. + RequestPayer string `protobuf:"bytes,11,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` + // Specifies the algorithm to use to when encrypting the object (for example, + // AES256). + SseCustomerAlgorithm string `protobuf:"bytes,12,opt,name=sse_customer_algorithm,json=sseCustomerAlgorithm,proto3" json:"sse_customer_algorithm,omitempty"` + // Specifies the customer-provided encryption key for Amazon S3 to use in + // encrypting data + SseCustomerKey string `protobuf:"bytes,13,opt,name=sse_customer_key,json=sseCustomerKey,proto3" json:"sse_customer_key,omitempty"` + // Specifies the 128-bit MD5 digest of the encryption key according to RFC 1321. + SseCustomerKeyMd5 string `protobuf:"bytes,14,opt,name=sse_customer_key_md5,json=sseCustomerKeyMd5,proto3" json:"sse_customer_key_md5,omitempty"` + // VersionId used to reference a specific version of the object. + VersionId string `protobuf:"bytes,15,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` + // Return object details meta + WithDetails bool `protobuf:"varint,16,opt,name=with_details,json=withDetails,proto3" json:"with_details,omitempty"` } -func (x *AppendObjectInput) Reset() { - *x = AppendObjectInput{} +func (x *HeadObjectInput) Reset() { + *x = HeadObjectInput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[59] + mi := &file_oss_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *AppendObjectInput) String() string { +func (x *HeadObjectInput) String() string { return protoimpl.X.MessageStringOf(x) } -func (*AppendObjectInput) ProtoMessage() {} +func (*HeadObjectInput) ProtoMessage() {} -func (x *AppendObjectInput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[59] +func (x *HeadObjectInput) ProtoReflect() protoreflect.Message { + mi := &file_oss_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6007,143 +6099,150 @@ func (x *AppendObjectInput) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use AppendObjectInput.ProtoReflect.Descriptor instead. -func (*AppendObjectInput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{59} +// Deprecated: Use HeadObjectInput.ProtoReflect.Descriptor instead. +func (*HeadObjectInput) Descriptor() ([]byte, []int) { + return file_oss_proto_rawDescGZIP(), []int{60} } -func (x *AppendObjectInput) GetStoreName() string { +func (x *HeadObjectInput) GetStoreName() string { if x != nil { return x.StoreName } return "" } -func (x *AppendObjectInput) GetBucket() string { +func (x *HeadObjectInput) GetBucket() string { if x != nil { return x.Bucket } return "" } -func (x *AppendObjectInput) GetKey() string { +func (x *HeadObjectInput) GetKey() string { if x != nil { return x.Key } return "" } -func (x *AppendObjectInput) GetBody() []byte { +func (x *HeadObjectInput) GetChecksumMode() string { if x != nil { - return x.Body + return x.ChecksumMode } - return nil + return "" } -func (x *AppendObjectInput) GetPosition() int64 { +func (x *HeadObjectInput) GetExpectedBucketOwner() string { if x != nil { - return x.Position + return x.ExpectedBucketOwner } - return 0 + return "" } -func (x *AppendObjectInput) GetAcl() string { +func (x *HeadObjectInput) GetIfMatch() string { if x != nil { - return x.Acl + return x.IfMatch } return "" } -func (x *AppendObjectInput) GetCacheControl() string { +func (x *HeadObjectInput) GetIfModifiedSince() int64 { if x != nil { - return x.CacheControl + return x.IfModifiedSince } - return "" + return 0 } -func (x *AppendObjectInput) GetContentDisposition() string { +func (x *HeadObjectInput) GetIfNoneMatch() string { if x != nil { - return x.ContentDisposition + return x.IfNoneMatch } return "" } -func (x *AppendObjectInput) GetContentEncoding() string { +func (x *HeadObjectInput) GetIfUnmodifiedSince() int64 { if x != nil { - return x.ContentEncoding + return x.IfUnmodifiedSince } - return "" + return 0 } -func (x *AppendObjectInput) GetContentMd5() string { +func (x *HeadObjectInput) GetPartNumber() int32 { if x != nil { - return x.ContentMd5 + return x.PartNumber + } + return 0 +} + +func (x *HeadObjectInput) GetRequestPayer() string { + if x != nil { + return x.RequestPayer } return "" } -func (x *AppendObjectInput) GetExpires() int64 { +func (x *HeadObjectInput) GetSseCustomerAlgorithm() string { if x != nil { - return x.Expires + return x.SseCustomerAlgorithm } - return 0 + return "" } -func (x *AppendObjectInput) GetStorageClass() string { +func (x *HeadObjectInput) GetSseCustomerKey() string { if x != nil { - return x.StorageClass + return x.SseCustomerKey } return "" } -func (x *AppendObjectInput) GetServerSideEncryption() string { +func (x *HeadObjectInput) GetSseCustomerKeyMd5() string { if x != nil { - return x.ServerSideEncryption + return x.SseCustomerKeyMd5 } return "" } -func (x *AppendObjectInput) GetMeta() string { +func (x *HeadObjectInput) GetVersionId() string { if x != nil { - return x.Meta + return x.VersionId } return "" } -func (x *AppendObjectInput) GetTags() map[string]string { +func (x *HeadObjectInput) GetWithDetails() bool { if x != nil { - return x.Tags + return x.WithDetails } - return nil + return false } -// AppendObjectOutput -type AppendObjectOutput struct { +// HeadObjectOutput +type HeadObjectOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // Next append position - AppendPosition int64 `protobuf:"varint,1,opt,name=append_position,json=appendPosition,proto3" json:"append_position,omitempty"` + // Metadata pertaining to the operation's result. + ResultMetadata map[string]string `protobuf:"bytes,1,rep,name=result_metadata,json=resultMetadata,proto3" json:"result_metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } -func (x *AppendObjectOutput) Reset() { - *x = AppendObjectOutput{} +func (x *HeadObjectOutput) Reset() { + *x = HeadObjectOutput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[60] + mi := &file_oss_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *AppendObjectOutput) String() string { +func (x *HeadObjectOutput) String() string { return protoimpl.X.MessageStringOf(x) } -func (*AppendObjectOutput) ProtoMessage() {} +func (*HeadObjectOutput) ProtoMessage() {} -func (x *AppendObjectOutput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[60] +func (x *HeadObjectOutput) ProtoReflect() protoreflect.Message { + mi := &file_oss_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6154,20 +6253,20 @@ func (x *AppendObjectOutput) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use AppendObjectOutput.ProtoReflect.Descriptor instead. -func (*AppendObjectOutput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{60} +// Deprecated: Use HeadObjectOutput.ProtoReflect.Descriptor instead. +func (*HeadObjectOutput) Descriptor() ([]byte, []int) { + return file_oss_proto_rawDescGZIP(), []int{61} } -func (x *AppendObjectOutput) GetAppendPosition() int64 { +func (x *HeadObjectOutput) GetResultMetadata() map[string]string { if x != nil { - return x.AppendPosition + return x.ResultMetadata } - return 0 + return nil } -// ListPartsInput -type ListPartsInput struct { +// IsObjectExistInput +type IsObjectExistInput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -6180,36 +6279,27 @@ type ListPartsInput struct { // Name of the object key. // This member is required. Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` - // The account ID of the expected bucket owner - ExpectedBucketOwner string `protobuf:"bytes,4,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` - // Sets the maximum number of parts to return - MaxParts int64 `protobuf:"varint,5,opt,name=max_parts,json=maxParts,proto3" json:"max_parts,omitempty"` - // Specifies the part after which listing should begin. Only parts with higher part - // numbers will be listed. - PartNumberMarker int64 `protobuf:"varint,6,opt,name=part_number_marker,json=partNumberMarker,proto3" json:"part_number_marker,omitempty"` - // Confirms that the requester knows that they will be charged for the request. - RequestPayer string `protobuf:"bytes,7,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` - // Upload ID identifying the multipart upload whose parts are being listed. - UploadId string `protobuf:"bytes,8,opt,name=upload_id,json=uploadId,proto3" json:"upload_id,omitempty"` + // Object version id + VersionId string `protobuf:"bytes,4,opt,name=version_id,json=versionId,proto3" json:"version_id,omitempty"` } -func (x *ListPartsInput) Reset() { - *x = ListPartsInput{} +func (x *IsObjectExistInput) Reset() { + *x = IsObjectExistInput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[61] + mi := &file_oss_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListPartsInput) String() string { +func (x *IsObjectExistInput) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListPartsInput) ProtoMessage() {} +func (*IsObjectExistInput) ProtoMessage() {} -func (x *ListPartsInput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[61] +func (x *IsObjectExistInput) ProtoReflect() protoreflect.Message { + mi := &file_oss_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6220,100 +6310,125 @@ func (x *ListPartsInput) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListPartsInput.ProtoReflect.Descriptor instead. -func (*ListPartsInput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{61} +// Deprecated: Use IsObjectExistInput.ProtoReflect.Descriptor instead. +func (*IsObjectExistInput) Descriptor() ([]byte, []int) { + return file_oss_proto_rawDescGZIP(), []int{62} } -func (x *ListPartsInput) GetStoreName() string { +func (x *IsObjectExistInput) GetStoreName() string { if x != nil { return x.StoreName } return "" } -func (x *ListPartsInput) GetBucket() string { +func (x *IsObjectExistInput) GetBucket() string { if x != nil { return x.Bucket } return "" } -func (x *ListPartsInput) GetKey() string { +func (x *IsObjectExistInput) GetKey() string { if x != nil { return x.Key } return "" } -func (x *ListPartsInput) GetExpectedBucketOwner() string { +func (x *IsObjectExistInput) GetVersionId() string { if x != nil { - return x.ExpectedBucketOwner + return x.VersionId } return "" } -func (x *ListPartsInput) GetMaxParts() int64 { - if x != nil { - return x.MaxParts - } - return 0 +// IsObjectExistOutput +type IsObjectExistOutput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Object exist or not + FileExist bool `protobuf:"varint,1,opt,name=file_exist,json=fileExist,proto3" json:"file_exist,omitempty"` } -func (x *ListPartsInput) GetPartNumberMarker() int64 { - if x != nil { - return x.PartNumberMarker +func (x *IsObjectExistOutput) Reset() { + *x = IsObjectExistOutput{} + if protoimpl.UnsafeEnabled { + mi := &file_oss_proto_msgTypes[63] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return 0 } -func (x *ListPartsInput) GetRequestPayer() string { - if x != nil { - return x.RequestPayer +func (x *IsObjectExistOutput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*IsObjectExistOutput) ProtoMessage() {} + +func (x *IsObjectExistOutput) ProtoReflect() protoreflect.Message { + mi := &file_oss_proto_msgTypes[63] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return "" + return mi.MessageOf(x) } -func (x *ListPartsInput) GetUploadId() string { +// Deprecated: Use IsObjectExistOutput.ProtoReflect.Descriptor instead. +func (*IsObjectExistOutput) Descriptor() ([]byte, []int) { + return file_oss_proto_rawDescGZIP(), []int{63} +} + +func (x *IsObjectExistOutput) GetFileExist() bool { if x != nil { - return x.UploadId + return x.FileExist } - return "" + return false } -// Part -type Part struct { +// SignURLInput +type SignURLInput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // Part Etag - Etag string `protobuf:"bytes,1,opt,name=etag,proto3" json:"etag,omitempty"` - // Last modified time - LastModified int64 `protobuf:"varint,2,opt,name=last_modified,json=lastModified,proto3" json:"last_modified,omitempty"` - // Part number - PartNumber int64 `protobuf:"varint,3,opt,name=part_number,json=partNumber,proto3" json:"part_number,omitempty"` - // Part size - Size int64 `protobuf:"varint,4,opt,name=size,proto3" json:"size,omitempty"` + // Required. The name of oss store. + StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` + // The bucket name containing the object + // This member is required + Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` + // Name of the object key. + // This member is required. + Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` + // the method for sign url, eg. GET、POST + Method string `protobuf:"bytes,4,opt,name=method,proto3" json:"method,omitempty"` + // expire time of the sign url + ExpiredInSec int64 `protobuf:"varint,5,opt,name=expired_in_sec,json=expiredInSec,proto3" json:"expired_in_sec,omitempty"` } -func (x *Part) Reset() { - *x = Part{} +func (x *SignURLInput) Reset() { + *x = SignURLInput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[62] + mi := &file_oss_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *Part) String() string { +func (x *SignURLInput) String() string { return protoimpl.X.MessageStringOf(x) } -func (*Part) ProtoMessage() {} +func (*SignURLInput) ProtoMessage() {} -func (x *Part) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[62] +func (x *SignURLInput) ProtoReflect() protoreflect.Message { + mi := &file_oss_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6324,85 +6439,73 @@ func (x *Part) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use Part.ProtoReflect.Descriptor instead. -func (*Part) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{62} +// Deprecated: Use SignURLInput.ProtoReflect.Descriptor instead. +func (*SignURLInput) Descriptor() ([]byte, []int) { + return file_oss_proto_rawDescGZIP(), []int{64} } -func (x *Part) GetEtag() string { +func (x *SignURLInput) GetStoreName() string { if x != nil { - return x.Etag + return x.StoreName } return "" } -func (x *Part) GetLastModified() int64 { +func (x *SignURLInput) GetBucket() string { if x != nil { - return x.LastModified + return x.Bucket } - return 0 + return "" } -func (x *Part) GetPartNumber() int64 { +func (x *SignURLInput) GetKey() string { if x != nil { - return x.PartNumber + return x.Key } - return 0 + return "" } -func (x *Part) GetSize() int64 { +func (x *SignURLInput) GetMethod() string { if x != nil { - return x.Size + return x.Method + } + return "" +} + +func (x *SignURLInput) GetExpiredInSec() int64 { + if x != nil { + return x.ExpiredInSec } return 0 } -// ListPartsOutput -type ListPartsOutput struct { +// SignURLOutput +type SignURLOutput struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // The bucket name containing the object - // This member is required - Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` - // Name of the object key. - // This member is required. - Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` - // Upload ID identifying the multipart upload whose parts are being listed. - UploadId string `protobuf:"bytes,3,opt,name=upload_id,json=uploadId,proto3" json:"upload_id,omitempty"` - // When a list is truncated, this element specifies the last part in the list, as - // well as the value to use for the part-number-marker request parameter in a - // subsequent request. - NextPartNumberMarker string `protobuf:"bytes,4,opt,name=next_part_number_marker,json=nextPartNumberMarker,proto3" json:"next_part_number_marker,omitempty"` - // Maximum number of parts that were allowed in the response. - MaxParts int64 `protobuf:"varint,5,opt,name=max_parts,json=maxParts,proto3" json:"max_parts,omitempty"` - // Indicates whether the returned list of parts is truncated. A true value - // indicates that the list was truncated. A list can be truncated if the number of - // parts exceeds the limit returned in the MaxParts element. - IsTruncated bool `protobuf:"varint,6,opt,name=is_truncated,json=isTruncated,proto3" json:"is_truncated,omitempty"` - // Container for elements related to a particular part. A response can contain zero - // or more Part elements. - Parts []*Part `protobuf:"bytes,7,rep,name=parts,proto3" json:"parts,omitempty"` + // Object signed url + SignedUrl string `protobuf:"bytes,1,opt,name=signed_url,json=signedUrl,proto3" json:"signed_url,omitempty"` } -func (x *ListPartsOutput) Reset() { - *x = ListPartsOutput{} +func (x *SignURLOutput) Reset() { + *x = SignURLOutput{} if protoimpl.UnsafeEnabled { - mi := &file_oss_proto_msgTypes[63] + mi := &file_oss_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *ListPartsOutput) String() string { +func (x *SignURLOutput) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ListPartsOutput) ProtoMessage() {} +func (*SignURLOutput) ProtoMessage() {} -func (x *ListPartsOutput) ProtoReflect() protoreflect.Message { - mi := &file_oss_proto_msgTypes[63] +func (x *SignURLOutput) ProtoReflect() protoreflect.Message { + mi := &file_oss_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6413,74 +6516,628 @@ func (x *ListPartsOutput) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ListPartsOutput.ProtoReflect.Descriptor instead. -func (*ListPartsOutput) Descriptor() ([]byte, []int) { - return file_oss_proto_rawDescGZIP(), []int{63} +// Deprecated: Use SignURLOutput.ProtoReflect.Descriptor instead. +func (*SignURLOutput) Descriptor() ([]byte, []int) { + return file_oss_proto_rawDescGZIP(), []int{65} } -func (x *ListPartsOutput) GetBucket() string { +func (x *SignURLOutput) GetSignedUrl() string { if x != nil { - return x.Bucket + return x.SignedUrl } return "" } -func (x *ListPartsOutput) GetKey() string { - if x != nil { - return x.Key - } - return "" +// UpdateBandwidthRateLimitInput +type UpdateBandwidthRateLimitInput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Required. The name of oss store. + StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` + // The average upload/download bandwidth rate limit in bits per second. + AverageRateLimitInBitsPerSec int64 `protobuf:"varint,2,opt,name=average_rate_limit_in_bits_per_sec,json=averageRateLimitInBitsPerSec,proto3" json:"average_rate_limit_in_bits_per_sec,omitempty"` + // Resource name of gateway + GatewayResourceName string `protobuf:"bytes,3,opt,name=gateway_resource_name,json=gatewayResourceName,proto3" json:"gateway_resource_name,omitempty"` } -func (x *ListPartsOutput) GetUploadId() string { - if x != nil { - return x.UploadId +func (x *UpdateBandwidthRateLimitInput) Reset() { + *x = UpdateBandwidthRateLimitInput{} + if protoimpl.UnsafeEnabled { + mi := &file_oss_proto_msgTypes[66] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return "" } -func (x *ListPartsOutput) GetNextPartNumberMarker() string { - if x != nil { - return x.NextPartNumberMarker +func (x *UpdateBandwidthRateLimitInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateBandwidthRateLimitInput) ProtoMessage() {} + +func (x *UpdateBandwidthRateLimitInput) ProtoReflect() protoreflect.Message { + mi := &file_oss_proto_msgTypes[66] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return "" + return mi.MessageOf(x) } -func (x *ListPartsOutput) GetMaxParts() int64 { +// Deprecated: Use UpdateBandwidthRateLimitInput.ProtoReflect.Descriptor instead. +func (*UpdateBandwidthRateLimitInput) Descriptor() ([]byte, []int) { + return file_oss_proto_rawDescGZIP(), []int{66} +} + +func (x *UpdateBandwidthRateLimitInput) GetStoreName() string { if x != nil { - return x.MaxParts + return x.StoreName } - return 0 + return "" } -func (x *ListPartsOutput) GetIsTruncated() bool { +func (x *UpdateBandwidthRateLimitInput) GetAverageRateLimitInBitsPerSec() int64 { if x != nil { - return x.IsTruncated + return x.AverageRateLimitInBitsPerSec } - return false + return 0 } -func (x *ListPartsOutput) GetParts() []*Part { +func (x *UpdateBandwidthRateLimitInput) GetGatewayResourceName() string { if x != nil { - return x.Parts + return x.GatewayResourceName } - return nil + return "" } -var File_oss_proto protoreflect.FileDescriptor +// AppendObjectInput +type AppendObjectInput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -var file_oss_proto_rawDesc = []byte{ - 0x0a, 0x09, 0x6f, 0x73, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1a, 0x73, 0x70, 0x65, - 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, - 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xdd, 0x07, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, - 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x32, 0x0a, 0x15, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x75, 0x63, + // Required. The name of oss store. + StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` + // The bucket name containing the object + // This member is required + Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` + // Name of the object key. + // This member is required. + Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` + // Object content + Body []byte `protobuf:"bytes,4,opt,name=body,proto3" json:"body,omitempty"` + // Append start position + Position int64 `protobuf:"varint,5,opt,name=position,proto3" json:"position,omitempty"` + // Object ACL + Acl string `protobuf:"bytes,6,opt,name=acl,proto3" json:"acl,omitempty"` + // Sets the Cache-Control header of the response. + CacheControl string `protobuf:"bytes,7,opt,name=cache_control,json=cacheControl,proto3" json:"cache_control,omitempty"` + // Sets the Content-Disposition header of the response + ContentDisposition string `protobuf:"bytes,8,opt,name=content_disposition,json=contentDisposition,proto3" json:"content_disposition,omitempty"` + // Sets the Content-Encoding header of the response + ContentEncoding string `protobuf:"bytes,9,opt,name=content_encoding,json=contentEncoding,proto3" json:"content_encoding,omitempty"` + // The base64-encoded 128-bit MD5 digest of the part data. + ContentMd5 string `protobuf:"bytes,10,opt,name=content_md5,json=contentMd5,proto3" json:"content_md5,omitempty"` + // Sets the Expires header of the response + Expires int64 `protobuf:"varint,11,opt,name=expires,proto3" json:"expires,omitempty"` + // Provides storage class information of the object. Amazon S3 returns this header + // for all objects except for S3 Standard storage class objects. + StorageClass string `protobuf:"bytes,12,opt,name=storage_class,json=storageClass,proto3" json:"storage_class,omitempty"` + // The server-side encryption algorithm used when storing this object in Amazon S3 + // (for example, AES256, aws:kms). + ServerSideEncryption string `protobuf:"bytes,13,opt,name=server_side_encryption,json=serverSideEncryption,proto3" json:"server_side_encryption,omitempty"` + // Object metadata + Meta string `protobuf:"bytes,14,opt,name=meta,proto3" json:"meta,omitempty"` + // Object tags + Tags map[string]string `protobuf:"bytes,15,rep,name=tags,proto3" json:"tags,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *AppendObjectInput) Reset() { + *x = AppendObjectInput{} + if protoimpl.UnsafeEnabled { + mi := &file_oss_proto_msgTypes[67] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AppendObjectInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AppendObjectInput) ProtoMessage() {} + +func (x *AppendObjectInput) ProtoReflect() protoreflect.Message { + mi := &file_oss_proto_msgTypes[67] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AppendObjectInput.ProtoReflect.Descriptor instead. +func (*AppendObjectInput) Descriptor() ([]byte, []int) { + return file_oss_proto_rawDescGZIP(), []int{67} +} + +func (x *AppendObjectInput) GetStoreName() string { + if x != nil { + return x.StoreName + } + return "" +} + +func (x *AppendObjectInput) GetBucket() string { + if x != nil { + return x.Bucket + } + return "" +} + +func (x *AppendObjectInput) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +func (x *AppendObjectInput) GetBody() []byte { + if x != nil { + return x.Body + } + return nil +} + +func (x *AppendObjectInput) GetPosition() int64 { + if x != nil { + return x.Position + } + return 0 +} + +func (x *AppendObjectInput) GetAcl() string { + if x != nil { + return x.Acl + } + return "" +} + +func (x *AppendObjectInput) GetCacheControl() string { + if x != nil { + return x.CacheControl + } + return "" +} + +func (x *AppendObjectInput) GetContentDisposition() string { + if x != nil { + return x.ContentDisposition + } + return "" +} + +func (x *AppendObjectInput) GetContentEncoding() string { + if x != nil { + return x.ContentEncoding + } + return "" +} + +func (x *AppendObjectInput) GetContentMd5() string { + if x != nil { + return x.ContentMd5 + } + return "" +} + +func (x *AppendObjectInput) GetExpires() int64 { + if x != nil { + return x.Expires + } + return 0 +} + +func (x *AppendObjectInput) GetStorageClass() string { + if x != nil { + return x.StorageClass + } + return "" +} + +func (x *AppendObjectInput) GetServerSideEncryption() string { + if x != nil { + return x.ServerSideEncryption + } + return "" +} + +func (x *AppendObjectInput) GetMeta() string { + if x != nil { + return x.Meta + } + return "" +} + +func (x *AppendObjectInput) GetTags() map[string]string { + if x != nil { + return x.Tags + } + return nil +} + +// AppendObjectOutput +type AppendObjectOutput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Next append position + AppendPosition int64 `protobuf:"varint,1,opt,name=append_position,json=appendPosition,proto3" json:"append_position,omitempty"` +} + +func (x *AppendObjectOutput) Reset() { + *x = AppendObjectOutput{} + if protoimpl.UnsafeEnabled { + mi := &file_oss_proto_msgTypes[68] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AppendObjectOutput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AppendObjectOutput) ProtoMessage() {} + +func (x *AppendObjectOutput) ProtoReflect() protoreflect.Message { + mi := &file_oss_proto_msgTypes[68] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AppendObjectOutput.ProtoReflect.Descriptor instead. +func (*AppendObjectOutput) Descriptor() ([]byte, []int) { + return file_oss_proto_rawDescGZIP(), []int{68} +} + +func (x *AppendObjectOutput) GetAppendPosition() int64 { + if x != nil { + return x.AppendPosition + } + return 0 +} + +// ListPartsInput +type ListPartsInput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Required. The name of oss store. + StoreName string `protobuf:"bytes,1,opt,name=store_name,json=storeName,proto3" json:"store_name,omitempty"` + // The bucket name containing the object + // This member is required + Bucket string `protobuf:"bytes,2,opt,name=bucket,proto3" json:"bucket,omitempty"` + // Name of the object key. + // This member is required. + Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` + // The account ID of the expected bucket owner + ExpectedBucketOwner string `protobuf:"bytes,4,opt,name=expected_bucket_owner,json=expectedBucketOwner,proto3" json:"expected_bucket_owner,omitempty"` + // Sets the maximum number of parts to return + MaxParts int64 `protobuf:"varint,5,opt,name=max_parts,json=maxParts,proto3" json:"max_parts,omitempty"` + // Specifies the part after which listing should begin. Only parts with higher part + // numbers will be listed. + PartNumberMarker int64 `protobuf:"varint,6,opt,name=part_number_marker,json=partNumberMarker,proto3" json:"part_number_marker,omitempty"` + // Confirms that the requester knows that they will be charged for the request. + RequestPayer string `protobuf:"bytes,7,opt,name=request_payer,json=requestPayer,proto3" json:"request_payer,omitempty"` + // Upload ID identifying the multipart upload whose parts are being listed. + UploadId string `protobuf:"bytes,8,opt,name=upload_id,json=uploadId,proto3" json:"upload_id,omitempty"` +} + +func (x *ListPartsInput) Reset() { + *x = ListPartsInput{} + if protoimpl.UnsafeEnabled { + mi := &file_oss_proto_msgTypes[69] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListPartsInput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListPartsInput) ProtoMessage() {} + +func (x *ListPartsInput) ProtoReflect() protoreflect.Message { + mi := &file_oss_proto_msgTypes[69] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListPartsInput.ProtoReflect.Descriptor instead. +func (*ListPartsInput) Descriptor() ([]byte, []int) { + return file_oss_proto_rawDescGZIP(), []int{69} +} + +func (x *ListPartsInput) GetStoreName() string { + if x != nil { + return x.StoreName + } + return "" +} + +func (x *ListPartsInput) GetBucket() string { + if x != nil { + return x.Bucket + } + return "" +} + +func (x *ListPartsInput) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +func (x *ListPartsInput) GetExpectedBucketOwner() string { + if x != nil { + return x.ExpectedBucketOwner + } + return "" +} + +func (x *ListPartsInput) GetMaxParts() int64 { + if x != nil { + return x.MaxParts + } + return 0 +} + +func (x *ListPartsInput) GetPartNumberMarker() int64 { + if x != nil { + return x.PartNumberMarker + } + return 0 +} + +func (x *ListPartsInput) GetRequestPayer() string { + if x != nil { + return x.RequestPayer + } + return "" +} + +func (x *ListPartsInput) GetUploadId() string { + if x != nil { + return x.UploadId + } + return "" +} + +// Part +type Part struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Part Etag + Etag string `protobuf:"bytes,1,opt,name=etag,proto3" json:"etag,omitempty"` + // Last modified time + LastModified int64 `protobuf:"varint,2,opt,name=last_modified,json=lastModified,proto3" json:"last_modified,omitempty"` + // Part number + PartNumber int64 `protobuf:"varint,3,opt,name=part_number,json=partNumber,proto3" json:"part_number,omitempty"` + // Part size + Size int64 `protobuf:"varint,4,opt,name=size,proto3" json:"size,omitempty"` +} + +func (x *Part) Reset() { + *x = Part{} + if protoimpl.UnsafeEnabled { + mi := &file_oss_proto_msgTypes[70] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Part) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Part) ProtoMessage() {} + +func (x *Part) ProtoReflect() protoreflect.Message { + mi := &file_oss_proto_msgTypes[70] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Part.ProtoReflect.Descriptor instead. +func (*Part) Descriptor() ([]byte, []int) { + return file_oss_proto_rawDescGZIP(), []int{70} +} + +func (x *Part) GetEtag() string { + if x != nil { + return x.Etag + } + return "" +} + +func (x *Part) GetLastModified() int64 { + if x != nil { + return x.LastModified + } + return 0 +} + +func (x *Part) GetPartNumber() int64 { + if x != nil { + return x.PartNumber + } + return 0 +} + +func (x *Part) GetSize() int64 { + if x != nil { + return x.Size + } + return 0 +} + +// ListPartsOutput +type ListPartsOutput struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The bucket name containing the object + // This member is required + Bucket string `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"` + // Name of the object key. + // This member is required. + Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` + // Upload ID identifying the multipart upload whose parts are being listed. + UploadId string `protobuf:"bytes,3,opt,name=upload_id,json=uploadId,proto3" json:"upload_id,omitempty"` + // When a list is truncated, this element specifies the last part in the list, as + // well as the value to use for the part-number-marker request parameter in a + // subsequent request. + NextPartNumberMarker string `protobuf:"bytes,4,opt,name=next_part_number_marker,json=nextPartNumberMarker,proto3" json:"next_part_number_marker,omitempty"` + // Maximum number of parts that were allowed in the response. + MaxParts int64 `protobuf:"varint,5,opt,name=max_parts,json=maxParts,proto3" json:"max_parts,omitempty"` + // Indicates whether the returned list of parts is truncated. A true value + // indicates that the list was truncated. A list can be truncated if the number of + // parts exceeds the limit returned in the MaxParts element. + IsTruncated bool `protobuf:"varint,6,opt,name=is_truncated,json=isTruncated,proto3" json:"is_truncated,omitempty"` + // Container for elements related to a particular part. A response can contain zero + // or more Part elements. + Parts []*Part `protobuf:"bytes,7,rep,name=parts,proto3" json:"parts,omitempty"` +} + +func (x *ListPartsOutput) Reset() { + *x = ListPartsOutput{} + if protoimpl.UnsafeEnabled { + mi := &file_oss_proto_msgTypes[71] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListPartsOutput) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListPartsOutput) ProtoMessage() {} + +func (x *ListPartsOutput) ProtoReflect() protoreflect.Message { + mi := &file_oss_proto_msgTypes[71] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListPartsOutput.ProtoReflect.Descriptor instead. +func (*ListPartsOutput) Descriptor() ([]byte, []int) { + return file_oss_proto_rawDescGZIP(), []int{71} +} + +func (x *ListPartsOutput) GetBucket() string { + if x != nil { + return x.Bucket + } + return "" +} + +func (x *ListPartsOutput) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +func (x *ListPartsOutput) GetUploadId() string { + if x != nil { + return x.UploadId + } + return "" +} + +func (x *ListPartsOutput) GetNextPartNumberMarker() string { + if x != nil { + return x.NextPartNumberMarker + } + return "" +} + +func (x *ListPartsOutput) GetMaxParts() int64 { + if x != nil { + return x.MaxParts + } + return 0 +} + +func (x *ListPartsOutput) GetIsTruncated() bool { + if x != nil { + return x.IsTruncated + } + return false +} + +func (x *ListPartsOutput) GetParts() []*Part { + if x != nil { + return x.Parts + } + return nil +} + +var File_oss_proto protoreflect.FileDescriptor + +var file_oss_proto_rawDesc = []byte{ + 0x0a, 0x09, 0x6f, 0x73, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1a, 0x73, 0x70, 0x65, + 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xdd, 0x07, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, + 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x32, 0x0a, 0x15, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x66, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, @@ -6583,7 +7240,7 @@ var file_oss_proto_rawDesc = []byte{ 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xaf, 0x05, 0x0a, 0x0e, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd4, 0x05, 0x0a, 0x0e, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, @@ -6597,1189 +7254,1297 @@ var file_oss_proto_rawDesc = []byte{ 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x61, 0x63, 0x68, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x2f, 0x0a, 0x13, 0x63, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x44, 0x69, 0x73, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x10, 0x63, - 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x45, 0x6e, - 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, - 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, - 0x12, 0x34, 0x0a, 0x16, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x73, 0x69, 0x64, 0x65, 0x5f, - 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x14, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x69, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x72, - 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, - 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, - 0x65, 0x64, 0x55, 0x72, 0x6c, 0x12, 0x48, 0x0a, 0x04, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x0d, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, - 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2e, - 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x6d, 0x65, 0x74, 0x61, 0x12, - 0x51, 0x0a, 0x07, 0x74, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x37, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, - 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x50, 0x75, - 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2e, 0x54, 0x61, 0x67, - 0x67, 0x69, 0x6e, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x74, 0x61, 0x67, 0x67, 0x69, - 0x6e, 0x67, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3a, 0x0a, 0x0c, 0x54, - 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xbb, 0x01, 0x0a, 0x0f, 0x50, 0x75, 0x74, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x2c, 0x0a, 0x12, 0x62, - 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4b, - 0x65, 0x79, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x74, 0x61, - 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, 0x12, 0x1e, 0x0a, - 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, - 0x0f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x64, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, - 0x68, 0x61, 0x72, 0x67, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0xa0, 0x01, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, - 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, - 0x63, 0x6b, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, - 0x65, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, - 0x70, 0x61, 0x79, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x79, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x81, 0x01, 0x0a, 0x12, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, - 0x23, 0x0a, 0x0d, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, - 0x72, 0x6b, 0x65, 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, - 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x64, 0x12, 0x1d, 0x0a, - 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x89, 0x02, 0x0a, - 0x15, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, - 0x67, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, - 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x4f, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3b, 0x2e, - 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, - 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x70, 0x75, 0x74, - 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, - 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x1a, - 0x37, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xeb, 0x01, 0x0a, 0x16, 0x50, 0x75, 0x74, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x4f, 0x75, 0x74, - 0x70, 0x75, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x49, 0x64, 0x12, 0x6f, 0x0a, 0x0f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x6d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x46, 0x2e, 0x73, 0x70, - 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, - 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x2e, - 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x0e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x1a, 0x41, 0x0a, 0x13, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xb6, 0x01, 0x0a, 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x49, 0x6e, - 0x70, 0x75, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x1d, 0x0a, 0x0a, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x32, 0x0a, 0x15, 0x65, - 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6f, - 0x77, 0x6e, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x65, 0x78, 0x70, 0x65, - 0x63, 0x74, 0x65, 0x64, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x22, - 0xf1, 0x01, 0x0a, 0x19, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x1d, 0x0a, - 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x72, 0x0a, 0x0f, - 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x49, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, - 0x73, 0x33, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, - 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x2e, 0x52, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x0e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x1a, 0x41, 0x0a, 0x13, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0xd8, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x1d, 0x0a, - 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, - 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x75, - 0x63, 0x6b, 0x65, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x32, 0x0a, 0x15, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, - 0x64, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x75, - 0x63, 0x6b, 0x65, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x79, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x79, 0x65, 0x72, 0x22, 0xf6, - 0x02, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, - 0x69, 0x6e, 0x67, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x50, 0x0a, 0x04, 0x74, 0x61, 0x67, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, - 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, - 0x67, 0x67, 0x69, 0x6e, 0x67, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x2e, 0x54, 0x61, 0x67, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x76, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x6f, 0x0a, 0x0f, 0x72, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x46, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, - 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, - 0x67, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x4d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, 0x72, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x37, 0x0a, 0x09, 0x54, - 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x41, 0x0a, 0x13, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x4d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x97, 0x01, 0x0a, 0x0a, 0x43, 0x6f, 0x70, 0x79, - 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x10, 0x63, 0x6f, 0x70, 0x79, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x42, 0x75, - 0x63, 0x6b, 0x65, 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, - 0x6f, 0x70, 0x79, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x33, 0x0a, 0x16, - 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x63, 0x6f, - 0x70, 0x79, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, - 0x64, 0x22, 0x90, 0x04, 0x0a, 0x0f, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x47, - 0x0a, 0x0b, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, - 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x0a, 0x63, 0x6f, 0x70, - 0x79, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x52, 0x0a, 0x07, 0x74, 0x61, 0x67, 0x67, 0x69, - 0x6e, 0x67, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, - 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2e, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x07, 0x74, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x65, - 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x65, 0x78, - 0x70, 0x69, 0x72, 0x65, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x11, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x44, 0x69, 0x72, 0x65, 0x63, - 0x74, 0x69, 0x76, 0x65, 0x12, 0x55, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, - 0x2e, 0x73, 0x33, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, - 0x70, 0x75, 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3a, 0x0a, 0x0c, 0x54, - 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0x4b, 0x0a, 0x10, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, 0x12, 0x23, 0x0a, 0x0d, - 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, - 0x64, 0x22, 0xad, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x5a, 0x0a, 0x12, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x6f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, - 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x52, 0x10, 0x63, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, - 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x22, 0x66, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x46, 0x0a, 0x07, 0x6f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x73, - 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, - 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x07, 0x6f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x69, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x05, 0x71, 0x75, 0x69, 0x65, 0x74, 0x22, 0x43, 0x0a, 0x10, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x1d, 0x0a, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0xac, - 0x01, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, - 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x3a, 0x0a, 0x06, - 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x73, - 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, - 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x52, 0x06, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x79, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x79, 0x65, 0x72, 0x22, 0x9e, 0x01, - 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, - 0x23, 0x0a, 0x0d, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, - 0x72, 0x6b, 0x65, 0x72, 0x12, 0x37, 0x0a, 0x18, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x6d, - 0x61, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, - 0x72, 0x6b, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x1d, 0x0a, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x5a, - 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x4f, - 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x43, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, - 0x2e, 0x73, 0x33, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x52, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x22, 0xaf, 0x02, 0x0a, 0x10, 0x4c, - 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, - 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, - 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, - 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x65, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, - 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x6e, 0x63, - 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x79, 0x70, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x65, 0x78, 0x70, - 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6f, 0x77, 0x6e, - 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, - 0x65, 0x64, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x16, 0x0a, - 0x06, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, - 0x61, 0x72, 0x6b, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x61, 0x78, 0x4b, 0x65, 0x79, 0x73, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x12, - 0x16, 0x0a, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x5f, 0x70, 0x61, 0x79, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, - 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x79, 0x65, 0x72, 0x22, 0xe2, 0x02, 0x0a, - 0x11, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x4f, 0x75, 0x74, 0x70, - 0x75, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, - 0x66, 0x69, 0x78, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x73, 0x12, 0x3e, 0x0a, 0x08, 0x63, - 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, - 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, - 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x64, - 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x6e, 0x63, - 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x79, 0x70, 0x65, 0x12, 0x21, - 0x0a, 0x0c, 0x69, 0x73, 0x5f, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, - 0x64, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x61, 0x78, - 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x6d, 0x61, 0x78, - 0x4b, 0x65, 0x79, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x6e, 0x65, 0x78, 0x74, - 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6e, - 0x65, 0x78, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x72, 0x65, - 0x66, 0x69, 0x78, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, - 0x78, 0x22, 0x3a, 0x0a, 0x05, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, - 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0xc5, 0x01, - 0x0a, 0x06, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x23, - 0x0a, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, - 0x69, 0x65, 0x64, 0x12, 0x37, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, - 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x52, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, - 0x73, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, - 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, - 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, - 0x43, 0x6c, 0x61, 0x73, 0x73, 0x22, 0x81, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x43, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x41, 0x63, 0x6c, 0x49, 0x6e, 0x70, 0x75, - 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x9b, 0x01, 0x0a, 0x18, 0x47, 0x65, - 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x41, 0x63, 0x6c, - 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x61, 0x6e, 0x6e, 0x65, 0x64, - 0x5f, 0x61, 0x63, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x61, 0x6e, 0x6e, - 0x65, 0x64, 0x41, 0x63, 0x6c, 0x12, 0x37, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, - 0x33, 0x2e, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x52, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x27, - 0x0a, 0x0f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x64, 0x22, 0x93, 0x01, 0x0a, 0x17, 0x50, 0x75, 0x74, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x41, 0x63, 0x6c, 0x49, 0x6e, - 0x70, 0x75, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x61, 0x63, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x61, 0x63, 0x6c, 0x12, 0x1d, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x44, 0x69, 0x73, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x10, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x45, 0x6e, + 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, + 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, + 0x12, 0x34, 0x0a, 0x16, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x73, 0x69, 0x64, 0x65, 0x5f, + 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x14, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x69, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x72, + 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, + 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, + 0x65, 0x64, 0x55, 0x72, 0x6c, 0x12, 0x48, 0x0a, 0x04, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x0d, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, + 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2e, + 0x4d, 0x65, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x6d, 0x65, 0x74, 0x61, 0x12, + 0x51, 0x0a, 0x07, 0x74, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x37, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x50, 0x75, + 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2e, 0x54, 0x61, 0x67, + 0x67, 0x69, 0x6e, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x74, 0x61, 0x67, 0x67, 0x69, + 0x6e, 0x67, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x74, 0x6f, 0x72, 0x61, + 0x67, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x4d, 0x65, 0x74, 0x61, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x1a, 0x3a, 0x0a, 0x0c, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xbb, 0x01, 0x0a, + 0x0f, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x12, 0x2c, 0x0a, 0x12, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x65, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x62, 0x75, + 0x63, 0x6b, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x12, + 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x74, + 0x61, 0x67, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x63, 0x68, + 0x61, 0x72, 0x67, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0xa0, 0x01, 0x0a, 0x11, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, + 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x79, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x79, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x43, 0x0a, - 0x18, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x61, 0x6e, 0x6e, 0x65, 0x64, - 0x41, 0x63, 0x6c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x5f, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x81, 0x01, + 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, + 0x74, 0x70, 0x75, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x6d, + 0x61, 0x72, 0x6b, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x64, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x5f, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, 0x68, 0x61, 0x72, 0x67, - 0x65, 0x64, 0x22, 0x7c, 0x0a, 0x12, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, + 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, + 0x64, 0x22, 0x89, 0x02, 0x0a, 0x15, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, + 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, + 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, + 0x63, 0x6b, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, + 0x65, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x4f, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, + 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, + 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x49, 0x64, 0x1a, 0x37, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xeb, 0x01, + 0x0a, 0x16, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, + 0x6e, 0x67, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x6f, 0x0a, 0x0f, 0x72, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x46, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x50, 0x75, + 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x4f, 0x75, + 0x74, 0x70, 0x75, 0x74, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x41, 0x0a, 0x13, 0x52, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xb6, 0x01, 0x0a, 0x18, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, + 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, - 0x22, 0x6e, 0x0a, 0x13, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x5f, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0e, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x64, - 0x12, 0x2e, 0x0a, 0x13, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6f, 0x75, 0x74, 0x70, - 0x75, 0x74, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x72, - 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x50, 0x61, 0x74, 0x68, - 0x22, 0xf5, 0x0b, 0x0a, 0x1a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, - 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, - 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, - 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x63, 0x6c, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x61, 0x63, 0x6c, 0x12, 0x2c, 0x0a, 0x12, 0x62, 0x75, - 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4b, 0x65, - 0x79, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x61, 0x63, 0x68, - 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0c, 0x63, 0x61, 0x63, 0x68, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x2f, 0x0a, - 0x13, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6f, 0x73, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x63, 0x6f, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x44, 0x69, 0x73, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, - 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, - 0x6e, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4c, 0x61, 0x6e, 0x67, - 0x75, 0x61, 0x67, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, - 0x74, 0x79, 0x70, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x65, 0x78, 0x70, 0x65, 0x63, - 0x74, 0x65, 0x64, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, - 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, - 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x65, - 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x65, 0x78, - 0x70, 0x69, 0x72, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x5f, 0x66, - 0x75, 0x6c, 0x6c, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x18, 0x0d, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x10, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x46, 0x75, 0x6c, 0x6c, 0x43, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x5f, 0x72, 0x65, 0x61, - 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x52, 0x65, - 0x61, 0x64, 0x12, 0x24, 0x0a, 0x0e, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x64, - 0x5f, 0x61, 0x63, 0x70, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x67, 0x72, 0x61, 0x6e, - 0x74, 0x52, 0x65, 0x61, 0x64, 0x41, 0x63, 0x70, 0x12, 0x26, 0x0a, 0x0f, 0x67, 0x72, 0x61, 0x6e, - 0x74, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x61, 0x63, 0x70, 0x18, 0x10, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0d, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x41, 0x63, 0x70, - 0x12, 0x61, 0x0a, 0x09, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x11, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x44, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, - 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, - 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x61, - 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x44, - 0x61, 0x74, 0x61, 0x12, 0x40, 0x0a, 0x1d, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6c, 0x6f, - 0x63, 0x6b, 0x5f, 0x6c, 0x65, 0x67, 0x61, 0x6c, 0x5f, 0x68, 0x6f, 0x6c, 0x64, 0x5f, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x19, 0x6f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x4c, 0x65, 0x67, 0x61, 0x6c, 0x48, 0x6f, 0x6c, 0x64, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, - 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0e, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x12, - 0x40, 0x0a, 0x1d, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x72, - 0x65, 0x74, 0x61, 0x69, 0x6e, 0x5f, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x5f, 0x64, 0x61, 0x74, 0x65, - 0x18, 0x14, 0x20, 0x01, 0x28, 0x03, 0x52, 0x19, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4c, 0x6f, - 0x63, 0x6b, 0x52, 0x65, 0x74, 0x61, 0x69, 0x6e, 0x55, 0x6e, 0x74, 0x69, 0x6c, 0x44, 0x61, 0x74, - 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x79, - 0x65, 0x72, 0x18, 0x15, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x50, 0x61, 0x79, 0x65, 0x72, 0x12, 0x34, 0x0a, 0x16, 0x73, 0x73, 0x65, 0x5f, 0x63, 0x75, - 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x5f, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, - 0x18, 0x16, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x73, 0x73, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, - 0x6d, 0x65, 0x72, 0x41, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x12, 0x28, 0x0a, 0x10, - 0x73, 0x73, 0x65, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x5f, 0x6b, 0x65, 0x79, - 0x18, 0x17, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x73, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, - 0x6d, 0x65, 0x72, 0x4b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x14, 0x73, 0x73, 0x65, 0x5f, 0x63, 0x75, - 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x6d, 0x64, 0x35, 0x18, 0x18, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, 0x73, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, - 0x72, 0x4b, 0x65, 0x79, 0x4d, 0x64, 0x35, 0x12, 0x3b, 0x0a, 0x1a, 0x73, 0x73, 0x65, 0x5f, 0x6b, - 0x6d, 0x73, 0x5f, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, - 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x19, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x73, 0x73, 0x65, - 0x4b, 0x6d, 0x73, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, - 0x74, 0x65, 0x78, 0x74, 0x12, 0x23, 0x0a, 0x0e, 0x73, 0x73, 0x65, 0x5f, 0x6b, 0x6d, 0x73, 0x5f, - 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x73, - 0x65, 0x4b, 0x6d, 0x73, 0x4b, 0x65, 0x79, 0x49, 0x64, 0x12, 0x34, 0x0a, 0x16, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x5f, 0x73, 0x69, 0x64, 0x65, 0x5f, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x53, 0x69, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x23, 0x0a, 0x0d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, - 0x18, 0x1c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, - 0x6c, 0x61, 0x73, 0x73, 0x12, 0x5d, 0x0a, 0x07, 0x74, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x18, - 0x1d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, - 0x73, 0x33, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, - 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2e, 0x54, 0x61, - 0x67, 0x67, 0x69, 0x6e, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x74, 0x61, 0x67, 0x67, - 0x69, 0x6e, 0x67, 0x12, 0x3a, 0x0a, 0x19, 0x77, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x5f, 0x72, - 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x1e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x77, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, - 0x65, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, - 0x3b, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3a, 0x0a, 0x0c, - 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, + 0x12, 0x32, 0x0a, 0x15, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x75, 0x63, + 0x6b, 0x65, 0x74, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x13, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4f, + 0x77, 0x6e, 0x65, 0x72, 0x22, 0xf1, 0x01, 0x0a, 0x19, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x4f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, + 0x64, 0x12, 0x72, 0x0a, 0x0f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x49, 0x2e, 0x73, 0x70, 0x65, + 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x4f, 0x75, 0x74, 0x70, 0x75, + 0x74, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x41, 0x0a, 0x13, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xfd, 0x03, 0x0a, 0x1b, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, - 0x61, 0x64, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, - 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x62, 0x6f, 0x72, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x61, 0x62, 0x6f, 0x72, 0x74, 0x44, 0x61, 0x74, - 0x65, 0x12, 0x22, 0x0a, 0x0d, 0x61, 0x62, 0x6f, 0x72, 0x74, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x5f, - 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x62, 0x6f, 0x72, 0x74, 0x52, - 0x75, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x2c, 0x0a, 0x12, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, - 0x6b, 0x65, 0x79, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x10, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x45, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x63, - 0x68, 0x61, 0x72, 0x67, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x64, 0x12, 0x34, 0x0a, 0x16, - 0x73, 0x73, 0x65, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x5f, 0x61, 0x6c, 0x67, - 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x73, 0x73, - 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x41, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, - 0x68, 0x6d, 0x12, 0x2f, 0x0a, 0x14, 0x73, 0x73, 0x65, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, - 0x65, 0x72, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x6d, 0x64, 0x35, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x11, 0x73, 0x73, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x4b, 0x65, 0x79, - 0x4d, 0x64, 0x35, 0x12, 0x3b, 0x0a, 0x1a, 0x73, 0x73, 0x65, 0x5f, 0x6b, 0x6d, 0x73, 0x5f, 0x65, - 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, - 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x73, 0x73, 0x65, 0x4b, 0x6d, 0x73, 0x45, - 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, - 0x12, 0x23, 0x0a, 0x0e, 0x73, 0x73, 0x65, 0x5f, 0x6b, 0x6d, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x5f, - 0x69, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x73, 0x65, 0x4b, 0x6d, 0x73, - 0x4b, 0x65, 0x79, 0x49, 0x64, 0x12, 0x34, 0x0a, 0x16, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, - 0x73, 0x69, 0x64, 0x65, 0x5f, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x69, 0x64, - 0x65, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x75, - 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x22, 0xde, 0x03, 0x0a, 0x0f, 0x55, 0x70, 0x6c, - 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x1d, 0x0a, 0x0a, - 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x62, - 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x75, 0x63, - 0x6b, 0x65, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, - 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x64, 0x35, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4d, 0x64, - 0x35, 0x12, 0x32, 0x0a, 0x15, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x75, - 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x13, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, - 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x5f, 0x6e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x74, - 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x5f, 0x70, 0x61, 0x79, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x79, 0x65, 0x72, 0x12, 0x34, 0x0a, 0x16, 0x73, - 0x73, 0x65, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x5f, 0x61, 0x6c, 0x67, 0x6f, - 0x72, 0x69, 0x74, 0x68, 0x6d, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x73, 0x73, 0x65, - 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x41, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, - 0x6d, 0x12, 0x28, 0x0a, 0x10, 0x73, 0x73, 0x65, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, - 0x72, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x73, 0x65, - 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x4b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x14, 0x73, - 0x73, 0x65, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x5f, 0x6b, 0x65, 0x79, 0x5f, - 0x6d, 0x64, 0x35, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, 0x73, 0x65, 0x43, 0x75, - 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x4b, 0x65, 0x79, 0x4d, 0x64, 0x35, 0x12, 0x1b, 0x0a, 0x09, - 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x22, 0xbf, 0x02, 0x0a, 0x10, 0x55, 0x70, - 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x2c, - 0x0a, 0x12, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x65, 0x6e, 0x61, - 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x62, 0x75, 0x63, 0x6b, - 0x65, 0x74, 0x4b, 0x65, 0x79, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x12, 0x0a, 0x04, - 0x65, 0x74, 0x61, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, - 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x63, 0x68, 0x61, 0x72, - 0x67, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x64, 0x12, 0x34, 0x0a, 0x16, 0x73, 0x73, 0x65, - 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x5f, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, - 0x74, 0x68, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x73, 0x73, 0x65, 0x43, 0x75, - 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x41, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x12, - 0x2f, 0x0a, 0x14, 0x73, 0x73, 0x65, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x5f, - 0x6b, 0x65, 0x79, 0x5f, 0x6d, 0x64, 0x35, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, - 0x73, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x4b, 0x65, 0x79, 0x4d, 0x64, 0x35, - 0x12, 0x23, 0x0a, 0x0e, 0x73, 0x73, 0x65, 0x5f, 0x6b, 0x6d, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x5f, - 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x73, 0x65, 0x4b, 0x6d, 0x73, - 0x4b, 0x65, 0x79, 0x49, 0x64, 0x12, 0x34, 0x0a, 0x16, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, - 0x73, 0x69, 0x64, 0x65, 0x5f, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x69, 0x64, - 0x65, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xa9, 0x02, 0x0a, 0x13, - 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, 0x49, 0x6e, - 0x70, 0x75, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x47, 0x0a, 0x0b, - 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x26, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, - 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x43, - 0x6f, 0x70, 0x79, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x0a, 0x63, 0x6f, 0x70, 0x79, 0x53, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x5f, 0x6e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x74, - 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, - 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x70, 0x6c, 0x6f, 0x61, - 0x64, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, - 0x72, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x70, - 0x61, 0x72, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x22, 0x49, 0x0a, 0x0e, 0x43, 0x6f, 0x70, 0x79, 0x50, - 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x74, 0x61, - 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, 0x12, 0x23, 0x0a, - 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, - 0x65, 0x64, 0x22, 0xba, 0x03, 0x0a, 0x14, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, - 0x74, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x2c, 0x0a, 0x12, 0x62, - 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4b, - 0x65, 0x79, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x54, 0x0a, 0x10, 0x63, 0x6f, 0x70, - 0x79, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, - 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x50, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, - 0x0e, 0x63, 0x6f, 0x70, 0x79, 0x50, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, - 0x33, 0x0a, 0x16, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x76, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x13, 0x63, 0x6f, 0x70, 0x79, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, - 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x64, 0x12, 0x34, 0x0a, - 0x16, 0x73, 0x73, 0x65, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x5f, 0x61, 0x6c, - 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x73, - 0x73, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x41, 0x6c, 0x67, 0x6f, 0x72, 0x69, - 0x74, 0x68, 0x6d, 0x12, 0x2f, 0x0a, 0x14, 0x73, 0x73, 0x65, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, - 0x6d, 0x65, 0x72, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x6d, 0x64, 0x35, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x11, 0x73, 0x73, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x4b, 0x65, - 0x79, 0x4d, 0x64, 0x35, 0x12, 0x23, 0x0a, 0x0e, 0x73, 0x73, 0x65, 0x5f, 0x6b, 0x6d, 0x73, 0x5f, - 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x73, - 0x65, 0x4b, 0x6d, 0x73, 0x4b, 0x65, 0x79, 0x49, 0x64, 0x12, 0x34, 0x0a, 0x16, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x5f, 0x73, 0x69, 0x64, 0x65, 0x5f, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x53, 0x69, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, - 0x44, 0x0a, 0x0d, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x50, 0x61, 0x72, 0x74, - 0x12, 0x12, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x65, 0x74, 0x61, 0x67, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x5f, 0x6e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x74, 0x4e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x5b, 0x0a, 0x18, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, - 0x65, 0x64, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, - 0x64, 0x12, 0x3f, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x29, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, - 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x43, 0x6f, - 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x50, 0x61, 0x72, 0x74, 0x52, 0x05, 0x70, 0x61, 0x72, - 0x74, 0x73, 0x22, 0xbe, 0x02, 0x0a, 0x1c, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x4d, - 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x6e, - 0x70, 0x75, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x1b, 0x0a, 0x09, - 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x79, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x79, 0x65, 0x72, 0x12, 0x32, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd8, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x70, + 0x75, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x32, 0x0a, 0x15, 0x65, 0x78, + 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6f, 0x77, + 0x6e, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x65, 0x78, 0x70, 0x65, 0x63, + 0x74, 0x65, 0x64, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x23, + 0x0a, 0x0d, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x79, 0x65, 0x72, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, + 0x79, 0x65, 0x72, 0x22, 0xf6, 0x02, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x50, + 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x73, + 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, + 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, + 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, + 0x6f, 0x0a, 0x0f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x46, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, + 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, + 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x2e, 0x52, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x0e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x1a, 0x37, 0x0a, 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x41, 0x0a, 0x13, 0x52, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x97, 0x01, 0x0a, + 0x0a, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x63, + 0x6f, 0x70, 0x79, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x63, 0x6f, 0x70, 0x79, 0x53, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x63, 0x6f, 0x70, + 0x79, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x70, 0x79, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4b, 0x65, + 0x79, 0x12, 0x33, 0x0a, 0x16, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x13, 0x63, 0x6f, 0x70, 0x79, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x90, 0x04, 0x0a, 0x0f, 0x43, 0x6f, 0x70, 0x79, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, + 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, + 0x6b, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, + 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x47, 0x0a, 0x0b, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, + 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x52, 0x0a, 0x63, 0x6f, 0x70, 0x79, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x52, 0x0a, 0x07, + 0x74, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, + 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2e, 0x54, 0x61, 0x67, 0x67, 0x69, + 0x6e, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x74, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, + 0x12, 0x18, 0x0a, 0x07, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x07, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x6d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x55, 0x0a, 0x08, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x73, 0x70, + 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, + 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x1a, 0x3a, 0x0a, 0x0c, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, + 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x4b, 0x0a, 0x10, 0x43, 0x6f, 0x70, + 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x12, 0x0a, + 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x74, 0x61, + 0x67, 0x12, 0x23, 0x0a, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, + 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x6f, + 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x22, 0xad, 0x01, 0x0a, 0x10, 0x43, 0x6f, 0x70, 0x79, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x5a, 0x0a, 0x12, 0x63, + 0x6f, 0x70, 0x79, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, + 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x10, 0x63, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x69, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x66, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x12, 0x46, 0x0a, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x2c, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, + 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, + 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x69, 0x65, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x71, 0x75, 0x69, 0x65, 0x74, 0x22, 0x43, + 0x0a, 0x10, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, + 0x65, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x49, 0x64, 0x22, 0xac, 0x01, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, + 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, + 0x6b, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, + 0x74, 0x12, 0x3a, 0x0a, 0x06, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x22, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, + 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x06, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x23, 0x0a, + 0x0d, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x79, 0x65, 0x72, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x79, + 0x65, 0x72, 0x22, 0x9e, 0x01, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x6d, + 0x61, 0x72, 0x6b, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x64, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x12, 0x37, 0x0a, 0x18, 0x64, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x64, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, + 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x49, 0x64, 0x22, 0x5a, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x43, 0x0a, 0x07, 0x64, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x73, 0x70, + 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, + 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x22, + 0xaf, 0x02, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x49, + 0x6e, 0x70, 0x75, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x64, + 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x6e, 0x63, + 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0c, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x79, 0x70, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, - 0x74, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x65, + 0x74, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4f, 0x77, 0x6e, - 0x65, 0x72, 0x12, 0x5f, 0x0a, 0x10, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x5f, - 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x73, - 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, - 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, - 0x74, 0x65, 0x64, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, - 0x61, 0x64, 0x52, 0x0f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, - 0x6f, 0x61, 0x64, 0x22, 0xe9, 0x02, 0x0a, 0x1d, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, - 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x4f, - 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x2c, 0x0a, 0x12, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x65, 0x6e, - 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x62, 0x75, 0x63, - 0x6b, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x12, 0x0a, - 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x74, 0x61, - 0x67, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, - 0x0f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x64, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, - 0x68, 0x61, 0x72, 0x67, 0x65, 0x64, 0x12, 0x22, 0x0a, 0x0d, 0x73, 0x73, 0x65, 0x5f, 0x6b, 0x6d, - 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x49, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, - 0x73, 0x65, 0x4b, 0x6d, 0x73, 0x4b, 0x65, 0x79, 0x49, 0x64, 0x12, 0x34, 0x0a, 0x16, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x5f, 0x73, 0x69, 0x64, 0x65, 0x5f, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x53, 0x69, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, - 0xda, 0x01, 0x0a, 0x19, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, - 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x1d, 0x0a, - 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, - 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x75, - 0x63, 0x6b, 0x65, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x32, 0x0a, 0x15, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, - 0x65, 0x64, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, - 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x79, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x79, 0x65, 0x72, 0x12, - 0x1b, 0x0a, 0x09, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x22, 0x45, 0x0a, 0x1a, - 0x41, 0x62, 0x6f, 0x72, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, - 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, 0x68, 0x61, 0x72, - 0x67, 0x65, 0x64, 0x22, 0xcb, 0x02, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x75, 0x6c, 0x74, - 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x49, 0x6e, 0x70, 0x75, - 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x6c, 0x69, - 0x6d, 0x69, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x6c, - 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, - 0x6e, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, - 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x79, 0x70, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x65, - 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6f, - 0x77, 0x6e, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x65, 0x78, 0x70, 0x65, - 0x63, 0x74, 0x65, 0x64, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, - 0x1d, 0x0a, 0x0a, 0x6b, 0x65, 0x79, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x6b, 0x65, 0x79, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x12, 0x1f, - 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x5f, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0a, 0x6d, 0x61, 0x78, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, - 0x16, 0x0a, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x28, 0x0a, 0x10, 0x75, 0x70, 0x6c, 0x6f, 0x61, - 0x64, 0x5f, 0x69, 0x64, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0e, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x4d, 0x61, 0x72, 0x6b, 0x65, - 0x72, 0x22, 0x3e, 0x0a, 0x09, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x21, - 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x22, 0x81, 0x02, 0x0a, 0x0f, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, - 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x74, - 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, - 0x74, 0x65, 0x64, 0x12, 0x43, 0x0a, 0x09, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x74, 0x6f, 0x72, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, - 0x2e, 0x73, 0x33, 0x2e, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x09, 0x69, - 0x6e, 0x69, 0x74, 0x69, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x37, 0x0a, 0x05, 0x6f, 0x77, - 0x6e, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x73, 0x70, 0x65, 0x63, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, - 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x52, 0x05, 0x6f, 0x77, - 0x6e, 0x65, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, - 0x6c, 0x61, 0x73, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x74, 0x6f, 0x72, - 0x61, 0x67, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x70, 0x6c, 0x6f, - 0x61, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x70, 0x6c, - 0x6f, 0x61, 0x64, 0x49, 0x64, 0x22, 0xe7, 0x03, 0x0a, 0x1a, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x75, - 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x4f, 0x75, - 0x74, 0x70, 0x75, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x27, 0x0a, 0x0f, - 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x50, 0x72, 0x65, - 0x66, 0x69, 0x78, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, - 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, - 0x74, 0x65, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x5f, - 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x6e, 0x63, 0x6f, - 0x64, 0x69, 0x6e, 0x67, 0x54, 0x79, 0x70, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x73, 0x5f, 0x74, - 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, - 0x69, 0x73, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6b, - 0x65, 0x79, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x6b, 0x65, 0x79, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x61, - 0x78, 0x5f, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x0a, 0x6d, 0x61, 0x78, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, - 0x65, 0x78, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x4b, 0x65, 0x79, 0x4d, 0x61, 0x72, - 0x6b, 0x65, 0x72, 0x12, 0x31, 0x0a, 0x15, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x75, 0x70, 0x6c, 0x6f, - 0x61, 0x64, 0x5f, 0x69, 0x64, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x78, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, - 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x28, - 0x0a, 0x10, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x5f, 0x6d, 0x61, 0x72, 0x6b, - 0x65, 0x72, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, - 0x49, 0x64, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x12, 0x45, 0x0a, 0x07, 0x75, 0x70, 0x6c, 0x6f, - 0x61, 0x64, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x73, 0x70, 0x65, 0x63, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, - 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, - 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x07, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x22, - 0xc5, 0x02, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, - 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, - 0x63, 0x6b, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, - 0x65, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, - 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, - 0x67, 0x54, 0x79, 0x70, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, - 0x64, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x75, - 0x63, 0x6b, 0x65, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x6b, 0x65, 0x79, - 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6b, - 0x65, 0x79, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, - 0x6b, 0x65, 0x79, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x4b, - 0x65, 0x79, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x2a, 0x0a, 0x11, 0x76, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, - 0x64, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x22, 0xbf, 0x01, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1b, 0x0a, - 0x09, 0x69, 0x73, 0x5f, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x08, 0x69, 0x73, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x23, 0x0a, 0x0d, - 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, - 0x64, 0x12, 0x37, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x21, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, - 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x4f, 0x77, - 0x6e, 0x65, 0x72, 0x52, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x88, 0x02, 0x0a, 0x0d, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x65, - 0x74, 0x61, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, 0x12, - 0x1b, 0x0a, 0x09, 0x69, 0x73, 0x5f, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x23, - 0x0a, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, - 0x69, 0x65, 0x64, 0x12, 0x37, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, - 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x52, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, - 0x73, 0x69, 0x7a, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, - 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, - 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, - 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x49, 0x64, 0x22, 0xb5, 0x04, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, - 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x66, - 0x69, 0x78, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6d, 0x6d, - 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x73, 0x12, 0x54, 0x0a, 0x0e, 0x64, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x61, + 0x78, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x6d, 0x61, 0x78, + 0x4b, 0x65, 0x79, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x23, 0x0a, 0x0d, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x79, 0x65, 0x72, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x79, 0x65, + 0x72, 0x22, 0xe2, 0x02, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x0e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x73, + 0x12, 0x3e, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x0d, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x73, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x79, 0x70, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x73, 0x5f, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x54, 0x72, 0x75, - 0x6e, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6b, 0x65, 0x79, 0x5f, 0x6d, 0x61, - 0x72, 0x6b, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6b, 0x65, 0x79, 0x4d, - 0x61, 0x72, 0x6b, 0x65, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, 0x6b, 0x65, 0x79, - 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x4b, 0x65, 0x79, 0x73, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x6b, 0x65, 0x79, - 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, - 0x65, 0x78, 0x74, 0x4b, 0x65, 0x79, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x12, 0x33, 0x0a, 0x16, - 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x5f, - 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x6e, 0x65, - 0x78, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x4d, 0x61, 0x72, 0x6b, 0x65, - 0x72, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x0b, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x2a, 0x0a, 0x11, 0x76, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x18, 0x0c, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x4d, - 0x61, 0x72, 0x6b, 0x65, 0x72, 0x12, 0x45, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, + 0x6e, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x12, 0x19, + 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x07, 0x6d, 0x61, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, + 0x0b, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x6e, 0x65, 0x78, 0x74, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x12, 0x16, + 0x0a, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x22, 0x3a, 0x0a, 0x05, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, + 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, + 0x69, 0x64, 0x22, 0xc5, 0x01, 0x0a, 0x06, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x12, 0x0a, + 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x74, 0x61, + 0x67, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x69, + 0x66, 0x69, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, + 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, 0x37, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, + 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, - 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xe7, 0x04, 0x0a, - 0x0f, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, + 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x52, 0x05, 0x6f, 0x77, 0x6e, 0x65, + 0x72, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, + 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x74, + 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x22, 0x81, 0x01, 0x0a, 0x17, 0x47, + 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x41, 0x63, + 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, + 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x1d, 0x0a, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x9b, + 0x01, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x61, 0x6e, 0x6e, + 0x65, 0x64, 0x41, 0x63, 0x6c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, + 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x5f, 0x61, 0x63, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x63, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x41, 0x63, 0x6c, 0x12, 0x37, 0x0a, 0x05, 0x6f, 0x77, + 0x6e, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x73, 0x70, 0x65, 0x63, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, + 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x52, 0x05, 0x6f, 0x77, + 0x6e, 0x65, 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x63, + 0x68, 0x61, 0x72, 0x67, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x64, 0x22, 0x93, 0x01, 0x0a, + 0x17, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x61, 0x6e, 0x6e, 0x65, 0x64, + 0x41, 0x63, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, + 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, + 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x63, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x61, 0x63, 0x6c, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, + 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x49, 0x64, 0x22, 0x43, 0x0a, 0x18, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, + 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x41, 0x63, 0x6c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x27, + 0x0a, 0x0f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x64, 0x22, 0x2a, 0x0a, 0x14, 0x47, 0x6c, 0x61, 0x63, 0x69, + 0x65, 0x72, 0x4a, 0x6f, 0x62, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, + 0x12, 0x0a, 0x04, 0x74, 0x69, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, + 0x69, 0x65, 0x72, 0x22, 0x49, 0x0a, 0x0e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x4c, 0x6f, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x75, 0x63, 0x6b, + 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x22, 0xc6, + 0x02, 0x0a, 0x08, 0x43, 0x53, 0x56, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x41, 0x0a, 0x1d, 0x61, + 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x64, 0x5f, 0x72, 0x65, 0x63, 0x6f, + 0x72, 0x64, 0x5f, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x1a, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x51, 0x75, 0x6f, 0x74, 0x65, 0x64, 0x52, + 0x65, 0x63, 0x6f, 0x72, 0x64, 0x44, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x12, 0x1a, + 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x66, 0x69, + 0x65, 0x6c, 0x64, 0x5f, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0e, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x65, 0x72, 0x12, 0x28, 0x0a, 0x10, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x68, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x66, + 0x69, 0x6c, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x27, 0x0a, + 0x0f, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x43, 0x68, 0x61, + 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x12, 0x34, 0x0a, 0x16, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x5f, + 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x45, 0x73, 0x63, + 0x61, 0x70, 0x65, 0x43, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x12, 0x29, 0x0a, 0x10, + 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x5f, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x44, 0x65, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x22, 0x8b, 0x01, 0x0a, 0x12, 0x49, 0x6e, 0x70, 0x75, + 0x74, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x36, + 0x0a, 0x03, 0x63, 0x73, 0x76, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x73, 0x70, + 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, + 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x43, 0x53, 0x56, 0x49, 0x6e, 0x70, 0x75, + 0x74, 0x52, 0x03, 0x63, 0x73, 0x76, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0f, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0xe1, 0x01, 0x0a, 0x09, 0x43, 0x53, 0x56, 0x4f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x64, 0x65, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x66, 0x69, + 0x65, 0x6c, 0x64, 0x44, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x12, 0x27, 0x0a, 0x0f, + 0x71, 0x75, 0x6f, 0x74, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x43, 0x68, 0x61, 0x72, + 0x61, 0x63, 0x74, 0x65, 0x72, 0x12, 0x34, 0x0a, 0x16, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x5f, 0x65, + 0x73, 0x63, 0x61, 0x70, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x45, 0x73, 0x63, 0x61, + 0x70, 0x65, 0x43, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x71, + 0x75, 0x6f, 0x74, 0x65, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x71, 0x75, 0x6f, 0x74, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x29, + 0x0a, 0x10, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x5f, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, + 0x44, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x22, 0x62, 0x0a, 0x13, 0x4f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x37, 0x0a, 0x03, 0x63, 0x73, 0x76, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, + 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x43, 0x53, 0x56, 0x4f, 0x75, + 0x74, 0x70, 0x75, 0x74, 0x52, 0x03, 0x63, 0x73, 0x76, 0x12, 0x12, 0x0a, 0x04, 0x6a, 0x73, 0x6f, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0xa0, 0x02, + 0x0a, 0x10, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x65, 0x78, 0x70, + 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x5f, 0x0a, 0x13, 0x69, + 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, + 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x53, 0x65, 0x72, 0x69, 0x61, + 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x12, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x53, + 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x62, 0x0a, 0x14, + 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x73, 0x70, 0x65, + 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x53, 0x65, + 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x6f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x86, 0x03, 0x0a, 0x0e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x79, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x04, 0x64, 0x61, 0x79, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x66, 0x0a, 0x16, 0x67, 0x6c, 0x61, + 0x63, 0x69, 0x65, 0x72, 0x5f, 0x6a, 0x6f, 0x62, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, + 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x73, 0x70, 0x65, 0x63, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, + 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x47, 0x6c, 0x61, 0x63, 0x69, 0x65, 0x72, 0x4a, 0x6f, + 0x62, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x14, 0x67, 0x6c, 0x61, + 0x63, 0x69, 0x65, 0x72, 0x4a, 0x6f, 0x62, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x73, 0x12, 0x53, 0x0a, 0x0f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x6c, 0x6f, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x73, 0x70, 0x65, + 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x4c, 0x6f, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x4c, 0x6f, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x59, 0x0a, 0x11, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x2c, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, + 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x53, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, + 0x10, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x73, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x74, 0x69, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0xd1, 0x01, 0x0a, 0x12, 0x52, 0x65, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x68, 0x65, - 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x32, - 0x0a, 0x15, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, - 0x74, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x65, - 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4f, 0x77, 0x6e, - 0x65, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x66, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x69, 0x66, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x2a, 0x0a, - 0x11, 0x69, 0x66, 0x5f, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x5f, 0x73, 0x69, 0x6e, - 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x69, 0x66, 0x4d, 0x6f, 0x64, 0x69, - 0x66, 0x69, 0x65, 0x64, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x12, 0x22, 0x0a, 0x0d, 0x69, 0x66, 0x5f, - 0x6e, 0x6f, 0x6e, 0x65, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x69, 0x66, 0x4e, 0x6f, 0x6e, 0x65, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x2e, 0x0a, - 0x13, 0x69, 0x66, 0x5f, 0x75, 0x6e, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x5f, 0x73, - 0x69, 0x6e, 0x63, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x69, 0x66, 0x55, 0x6e, - 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x12, 0x1f, 0x0a, - 0x0b, 0x70, 0x61, 0x72, 0x74, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x0a, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x74, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x23, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x53, 0x0a, 0x0f, 0x72, 0x65, 0x73, + 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, + 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0e, + 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, + 0x0a, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x6e, 0x0a, + 0x13, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, + 0x74, 0x70, 0x75, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, + 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x64, 0x12, 0x2e, 0x0a, + 0x13, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, + 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x72, 0x65, 0x73, 0x74, + 0x6f, 0x72, 0x65, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x50, 0x61, 0x74, 0x68, 0x22, 0xf5, 0x0b, + 0x0a, 0x1a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, + 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x1d, 0x0a, 0x0a, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x62, + 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x75, 0x63, + 0x6b, 0x65, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x63, 0x6c, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x61, 0x63, 0x6c, 0x12, 0x2c, 0x0a, 0x12, 0x62, 0x75, 0x63, 0x6b, 0x65, + 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x10, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x45, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x61, + 0x63, 0x68, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x2f, 0x0a, 0x13, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x44, 0x69, 0x73, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x10, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x45, 0x6e, + 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x5f, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, + 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, + 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x0b, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x13, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x75, 0x63, + 0x6b, 0x65, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x78, 0x70, 0x69, + 0x72, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x65, 0x78, 0x70, 0x69, 0x72, + 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x5f, 0x66, 0x75, 0x6c, 0x6c, + 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, + 0x67, 0x72, 0x61, 0x6e, 0x74, 0x46, 0x75, 0x6c, 0x6c, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x12, 0x1d, 0x0a, 0x0a, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x18, 0x0e, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x61, 0x64, 0x12, + 0x24, 0x0a, 0x0e, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x61, 0x63, + 0x70, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x52, 0x65, + 0x61, 0x64, 0x41, 0x63, 0x70, 0x12, 0x26, 0x0a, 0x0f, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x5f, 0x77, + 0x72, 0x69, 0x74, 0x65, 0x5f, 0x61, 0x63, 0x70, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, + 0x67, 0x72, 0x61, 0x6e, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x41, 0x63, 0x70, 0x12, 0x61, 0x0a, + 0x09, 0x6d, 0x65, 0x74, 0x61, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x11, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x44, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, + 0x6f, 0x61, 0x64, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, + 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, + 0x12, 0x40, 0x0a, 0x1d, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, + 0x6c, 0x65, 0x67, 0x61, 0x6c, 0x5f, 0x68, 0x6f, 0x6c, 0x64, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x19, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4c, + 0x6f, 0x63, 0x6b, 0x4c, 0x65, 0x67, 0x61, 0x6c, 0x48, 0x6f, 0x6c, 0x64, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6c, 0x6f, 0x63, + 0x6b, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x40, 0x0a, 0x1d, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x72, 0x65, 0x74, 0x61, + 0x69, 0x6e, 0x5f, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x14, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x19, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4c, 0x6f, 0x63, 0x6b, 0x52, + 0x65, 0x74, 0x61, 0x69, 0x6e, 0x55, 0x6e, 0x74, 0x69, 0x6c, 0x44, 0x61, 0x74, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x79, 0x65, 0x72, 0x18, - 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, + 0x15, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x79, 0x65, 0x72, 0x12, 0x34, 0x0a, 0x16, 0x73, 0x73, 0x65, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, - 0x6d, 0x65, 0x72, 0x5f, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x18, 0x0c, 0x20, + 0x6d, 0x65, 0x72, 0x5f, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x18, 0x16, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x73, 0x73, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x41, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x12, 0x28, 0x0a, 0x10, 0x73, 0x73, 0x65, - 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x0d, 0x20, + 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x17, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x73, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x4b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x14, 0x73, 0x73, 0x65, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, - 0x6d, 0x65, 0x72, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x6d, 0x64, 0x35, 0x18, 0x0e, 0x20, 0x01, 0x28, + 0x6d, 0x65, 0x72, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x6d, 0x64, 0x35, 0x18, 0x18, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, 0x73, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x4b, 0x65, - 0x79, 0x4d, 0x64, 0x35, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, - 0x69, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x64, 0x65, 0x74, 0x61, - 0x69, 0x6c, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x77, 0x69, 0x74, 0x68, 0x44, - 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0xc0, 0x01, 0x0a, 0x10, 0x48, 0x65, 0x61, 0x64, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x69, 0x0a, 0x0f, 0x72, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x40, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, - 0x33, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, - 0x75, 0x74, 0x2e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x4d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x41, 0x0a, 0x13, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x79, 0x4d, 0x64, 0x35, 0x12, 0x3b, 0x0a, 0x1a, 0x73, 0x73, 0x65, 0x5f, 0x6b, 0x6d, 0x73, 0x5f, + 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x78, 0x74, 0x18, 0x19, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x73, 0x73, 0x65, 0x4b, 0x6d, 0x73, + 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, + 0x74, 0x12, 0x23, 0x0a, 0x0e, 0x73, 0x73, 0x65, 0x5f, 0x6b, 0x6d, 0x73, 0x5f, 0x6b, 0x65, 0x79, + 0x5f, 0x69, 0x64, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x73, 0x65, 0x4b, 0x6d, + 0x73, 0x4b, 0x65, 0x79, 0x49, 0x64, 0x12, 0x34, 0x0a, 0x16, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x5f, 0x73, 0x69, 0x64, 0x65, 0x5f, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x1b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x69, + 0x64, 0x65, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, + 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x1c, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6c, 0x61, 0x73, + 0x73, 0x12, 0x5d, 0x0a, 0x07, 0x74, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x18, 0x1d, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x43, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, + 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2e, 0x54, 0x61, 0x67, 0x67, 0x69, + 0x6e, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x74, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, + 0x12, 0x3a, 0x0a, 0x19, 0x77, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x5f, 0x72, 0x65, 0x64, 0x69, + 0x72, 0x65, 0x63, 0x74, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x1e, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x17, 0x77, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, 0x65, 0x64, 0x69, + 0x72, 0x65, 0x63, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x3b, 0x0a, 0x0d, + 0x4d, 0x65, 0x74, 0x61, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x7c, 0x0a, 0x12, 0x49, 0x73, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, - 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, - 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x34, 0x0a, 0x13, 0x49, 0x73, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x1d, - 0x0a, 0x0a, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x65, 0x78, 0x69, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x09, 0x66, 0x69, 0x6c, 0x65, 0x45, 0x78, 0x69, 0x73, 0x74, 0x22, 0x95, 0x01, - 0x0a, 0x0c, 0x53, 0x69, 0x67, 0x6e, 0x55, 0x52, 0x4c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x1d, - 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, - 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, - 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, - 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, - 0x24, 0x0a, 0x0e, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x69, 0x6e, 0x5f, 0x73, 0x65, - 0x63, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x64, - 0x49, 0x6e, 0x53, 0x65, 0x63, 0x22, 0x2e, 0x0a, 0x0d, 0x53, 0x69, 0x67, 0x6e, 0x55, 0x52, 0x4c, - 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, - 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, - 0x65, 0x64, 0x55, 0x72, 0x6c, 0x22, 0xbc, 0x01, 0x0a, 0x1d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x42, 0x61, 0x6e, 0x64, 0x77, 0x69, 0x64, 0x74, 0x68, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, - 0x69, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, - 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x48, 0x0a, 0x22, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, - 0x65, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x69, 0x6e, 0x5f, - 0x62, 0x69, 0x74, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x1c, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x52, 0x61, 0x74, 0x65, 0x4c, - 0x69, 0x6d, 0x69, 0x74, 0x49, 0x6e, 0x42, 0x69, 0x74, 0x73, 0x50, 0x65, 0x72, 0x53, 0x65, 0x63, - 0x12, 0x32, 0x0a, 0x15, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x72, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x13, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xcf, 0x04, 0x0a, 0x11, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3a, 0x0a, 0x0c, 0x54, 0x61, 0x67, + 0x67, 0x69, 0x6e, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xfd, 0x03, 0x0a, 0x1b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x4f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x1d, 0x0a, 0x0a, 0x61, 0x62, 0x6f, 0x72, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x09, 0x61, 0x62, 0x6f, 0x72, 0x74, 0x44, 0x61, 0x74, 0x65, 0x12, 0x22, + 0x0a, 0x0d, 0x61, 0x62, 0x6f, 0x72, 0x74, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x62, 0x6f, 0x72, 0x74, 0x52, 0x75, 0x6c, 0x65, + 0x49, 0x64, 0x12, 0x2c, 0x0a, 0x12, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, + 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, + 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x63, 0x68, 0x61, 0x72, + 0x67, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x64, 0x12, 0x34, 0x0a, 0x16, 0x73, 0x73, 0x65, + 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x5f, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, + 0x74, 0x68, 0x6d, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x73, 0x73, 0x65, 0x43, 0x75, + 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x41, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x12, + 0x2f, 0x0a, 0x14, 0x73, 0x73, 0x65, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x5f, + 0x6b, 0x65, 0x79, 0x5f, 0x6d, 0x64, 0x35, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, + 0x73, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x4b, 0x65, 0x79, 0x4d, 0x64, 0x35, + 0x12, 0x3b, 0x0a, 0x1a, 0x73, 0x73, 0x65, 0x5f, 0x6b, 0x6d, 0x73, 0x5f, 0x65, 0x6e, 0x63, 0x72, + 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x73, 0x73, 0x65, 0x4b, 0x6d, 0x73, 0x45, 0x6e, 0x63, 0x72, + 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x23, 0x0a, + 0x0e, 0x73, 0x73, 0x65, 0x5f, 0x6b, 0x6d, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x64, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x73, 0x65, 0x4b, 0x6d, 0x73, 0x4b, 0x65, 0x79, + 0x49, 0x64, 0x12, 0x34, 0x0a, 0x16, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x73, 0x69, 0x64, + 0x65, 0x5f, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x14, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x69, 0x64, 0x65, 0x45, 0x6e, + 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x70, 0x6c, 0x6f, + 0x61, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x70, 0x6c, + 0x6f, 0x61, 0x64, 0x49, 0x64, 0x22, 0xde, 0x03, 0x0a, 0x0f, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, + 0x50, 0x61, 0x72, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, + 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, + 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, + 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x1f, 0x0a, + 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x64, 0x35, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4d, 0x64, 0x35, 0x12, 0x32, + 0x0a, 0x15, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, + 0x74, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x65, + 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4f, 0x77, 0x6e, + 0x65, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x74, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, + 0x61, 0x79, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x50, 0x61, 0x79, 0x65, 0x72, 0x12, 0x34, 0x0a, 0x16, 0x73, 0x73, 0x65, 0x5f, + 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x5f, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, + 0x68, 0x6d, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x73, 0x73, 0x65, 0x43, 0x75, 0x73, + 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x41, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x12, 0x28, + 0x0a, 0x10, 0x73, 0x73, 0x65, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x5f, 0x6b, + 0x65, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x73, 0x65, 0x43, 0x75, 0x73, + 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x4b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x14, 0x73, 0x73, 0x65, 0x5f, + 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x6d, 0x64, 0x35, + 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, 0x73, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, + 0x6d, 0x65, 0x72, 0x4b, 0x65, 0x79, 0x4d, 0x64, 0x35, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x70, 0x6c, + 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x70, + 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x22, 0xbf, 0x02, 0x0a, 0x10, 0x55, 0x70, 0x6c, 0x6f, 0x61, + 0x64, 0x50, 0x61, 0x72, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x2c, 0x0a, 0x12, 0x62, + 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4b, + 0x65, 0x79, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x74, 0x61, + 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, 0x12, 0x27, 0x0a, + 0x0f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x64, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, + 0x68, 0x61, 0x72, 0x67, 0x65, 0x64, 0x12, 0x34, 0x0a, 0x16, 0x73, 0x73, 0x65, 0x5f, 0x63, 0x75, + 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x5f, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x73, 0x73, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, + 0x6d, 0x65, 0x72, 0x41, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x12, 0x2f, 0x0a, 0x14, + 0x73, 0x73, 0x65, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x5f, 0x6b, 0x65, 0x79, + 0x5f, 0x6d, 0x64, 0x35, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, 0x73, 0x65, 0x43, + 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x4b, 0x65, 0x79, 0x4d, 0x64, 0x35, 0x12, 0x23, 0x0a, + 0x0e, 0x73, 0x73, 0x65, 0x5f, 0x6b, 0x6d, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x64, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x73, 0x65, 0x4b, 0x6d, 0x73, 0x4b, 0x65, 0x79, + 0x49, 0x64, 0x12, 0x34, 0x0a, 0x16, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x73, 0x69, 0x64, + 0x65, 0x5f, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x14, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x69, 0x64, 0x65, 0x45, 0x6e, + 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xa9, 0x02, 0x0a, 0x13, 0x55, 0x70, 0x6c, + 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, 0x49, 0x6e, 0x70, 0x75, 0x74, + 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x47, 0x0a, 0x0b, 0x63, 0x6f, 0x70, + 0x79, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, + 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x43, 0x6f, 0x70, 0x79, + 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x0a, 0x63, 0x6f, 0x70, 0x79, 0x53, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x74, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, + 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x50, + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x72, 0x74, 0x5f, + 0x73, 0x69, 0x7a, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x70, 0x61, 0x72, 0x74, + 0x53, 0x69, 0x7a, 0x65, 0x22, 0x49, 0x0a, 0x0e, 0x43, 0x6f, 0x70, 0x79, 0x50, 0x61, 0x72, 0x74, + 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, 0x12, 0x23, 0x0a, 0x0d, 0x6c, 0x61, + 0x73, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x22, + 0xba, 0x03, 0x0a, 0x14, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, + 0x70, 0x79, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x2c, 0x0a, 0x12, 0x62, 0x75, 0x63, 0x6b, + 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x45, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x54, 0x0a, 0x10, 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x70, + 0x61, 0x72, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x2a, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x43, 0x6f, + 0x70, 0x79, 0x50, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x0e, 0x63, 0x6f, + 0x70, 0x79, 0x50, 0x61, 0x72, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x33, 0x0a, 0x16, + 0x63, 0x6f, 0x70, 0x79, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x63, 0x6f, + 0x70, 0x79, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, + 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x63, 0x68, 0x61, + 0x72, 0x67, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x64, 0x12, 0x34, 0x0a, 0x16, 0x73, 0x73, + 0x65, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x5f, 0x61, 0x6c, 0x67, 0x6f, 0x72, + 0x69, 0x74, 0x68, 0x6d, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x73, 0x73, 0x65, 0x43, + 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x41, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, + 0x12, 0x2f, 0x0a, 0x14, 0x73, 0x73, 0x65, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, + 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x6d, 0x64, 0x35, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, + 0x73, 0x73, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x4b, 0x65, 0x79, 0x4d, 0x64, + 0x35, 0x12, 0x23, 0x0a, 0x0e, 0x73, 0x73, 0x65, 0x5f, 0x6b, 0x6d, 0x73, 0x5f, 0x6b, 0x65, 0x79, + 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x73, 0x65, 0x4b, 0x6d, + 0x73, 0x4b, 0x65, 0x79, 0x49, 0x64, 0x12, 0x34, 0x0a, 0x16, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x5f, 0x73, 0x69, 0x64, 0x65, 0x5f, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x69, + 0x64, 0x65, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x44, 0x0a, 0x0d, + 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x50, 0x61, 0x72, 0x74, 0x12, 0x12, 0x0a, + 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x74, 0x61, + 0x67, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x74, 0x4e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x22, 0x5b, 0x0a, 0x18, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x4d, + 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x3f, + 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, + 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, + 0x65, 0x74, 0x65, 0x64, 0x50, 0x61, 0x72, 0x74, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x73, 0x22, + 0xbe, 0x02, 0x0a, 0x1c, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x75, 0x6c, 0x74, + 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x6e, 0x70, 0x75, 0x74, + 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x70, 0x6c, + 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x70, + 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x5f, 0x70, 0x61, 0x79, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x79, 0x65, 0x72, 0x12, 0x32, 0x0a, 0x15, 0x65, + 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6f, + 0x77, 0x6e, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x65, 0x78, 0x70, 0x65, + 0x63, 0x74, 0x65, 0x64, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, + 0x5f, 0x0a, 0x10, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x5f, 0x75, 0x70, 0x6c, + 0x6f, 0x61, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x73, 0x70, 0x65, 0x63, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, + 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, + 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, + 0x0f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, + 0x22, 0xe9, 0x02, 0x0a, 0x1d, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x75, 0x6c, + 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x12, + 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, + 0x4b, 0x65, 0x79, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x74, + 0x61, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, 0x12, 0x1e, + 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, + 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x64, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, 0x68, 0x61, 0x72, + 0x67, 0x65, 0x64, 0x12, 0x22, 0x0a, 0x0d, 0x73, 0x73, 0x65, 0x5f, 0x6b, 0x6d, 0x73, 0x5f, 0x6b, + 0x65, 0x79, 0x49, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x73, 0x65, 0x4b, + 0x6d, 0x73, 0x4b, 0x65, 0x79, 0x49, 0x64, 0x12, 0x34, 0x0a, 0x16, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x5f, 0x73, 0x69, 0x64, 0x65, 0x5f, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, + 0x69, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, + 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0xda, 0x01, 0x0a, + 0x19, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, + 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x63, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x61, 0x63, 0x6c, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x61, - 0x63, 0x68, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x2f, 0x0a, 0x13, 0x63, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x44, 0x69, 0x73, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x10, 0x63, - 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x45, 0x6e, - 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x5f, 0x6d, 0x64, 0x35, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x4d, 0x64, 0x35, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x78, 0x70, 0x69, 0x72, - 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, - 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x61, - 0x73, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, - 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x34, 0x0a, 0x16, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x5f, 0x73, 0x69, 0x64, 0x65, 0x5f, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x69, - 0x64, 0x65, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, - 0x6d, 0x65, 0x74, 0x61, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6d, 0x65, 0x74, 0x61, - 0x12, 0x4b, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, - 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, - 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x41, 0x70, 0x70, 0x65, - 0x6e, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2e, 0x54, 0x61, - 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x1a, 0x37, 0x0a, - 0x09, 0x54, 0x61, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3d, 0x0a, 0x12, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x27, 0x0a, 0x0f, - 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x50, 0x6f, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x9a, 0x02, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, - 0x72, 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, + 0x6b, 0x65, 0x79, 0x12, 0x32, 0x0a, 0x15, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, + 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x13, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x75, 0x63, 0x6b, + 0x65, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x5f, 0x70, 0x61, 0x79, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x79, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, + 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x22, 0x45, 0x0a, 0x1a, 0x41, 0x62, 0x6f, + 0x72, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, + 0x64, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x5f, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0e, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x64, + 0x22, 0xcb, 0x02, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, + 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x1d, + 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, + 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, + 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x65, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x6e, 0x63, 0x6f, + 0x64, 0x69, 0x6e, 0x67, 0x54, 0x79, 0x70, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x65, 0x78, 0x70, 0x65, + 0x63, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6f, 0x77, 0x6e, 0x65, + 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, + 0x64, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, + 0x6b, 0x65, 0x79, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x6b, 0x65, 0x79, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, + 0x61, 0x78, 0x5f, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x0a, 0x6d, 0x61, 0x78, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x16, 0x0a, 0x06, + 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x72, + 0x65, 0x66, 0x69, 0x78, 0x12, 0x28, 0x0a, 0x10, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, + 0x64, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, + 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x22, 0x3e, + 0x0a, 0x09, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x64, + 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x81, + 0x02, 0x0a, 0x0f, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, + 0x61, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x74, 0x65, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x74, 0x65, 0x64, + 0x12, 0x43, 0x0a, 0x09, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, + 0x2e, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x09, 0x69, 0x6e, 0x69, 0x74, + 0x69, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x37, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, + 0x2e, 0x73, 0x33, 0x2e, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x52, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, + 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, + 0x43, 0x6c, 0x61, 0x73, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f, + 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, + 0x49, 0x64, 0x22, 0xe7, 0x03, 0x0a, 0x1a, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, + 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, + 0x74, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, + 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, + 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, + 0x67, 0x54, 0x79, 0x70, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x73, 0x5f, 0x74, 0x72, 0x75, 0x6e, + 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x54, + 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6b, 0x65, 0x79, 0x5f, + 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6b, 0x65, + 0x79, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x61, 0x78, 0x5f, 0x75, + 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x6d, 0x61, + 0x78, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, + 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x4b, 0x65, 0x79, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, + 0x12, 0x31, 0x0a, 0x15, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f, + 0x69, 0x64, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x12, 0x6e, 0x65, 0x78, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x4d, 0x61, 0x72, + 0x6b, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x28, 0x0a, 0x10, 0x75, + 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x18, + 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x4d, + 0x61, 0x72, 0x6b, 0x65, 0x72, 0x12, 0x45, 0x0a, 0x07, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, + 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, + 0x2e, 0x73, 0x33, 0x2e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, + 0x6f, 0x61, 0x64, 0x52, 0x07, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x22, 0xc5, 0x02, 0x0a, + 0x17, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x32, 0x0a, 0x15, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x75, - 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x13, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, - 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x70, 0x61, 0x72, - 0x74, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x50, 0x61, 0x72, - 0x74, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x61, 0x72, 0x74, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, - 0x70, 0x61, 0x72, 0x74, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, - 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x79, 0x65, - 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x50, 0x61, 0x79, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f, - 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, - 0x49, 0x64, 0x22, 0x74, 0x0a, 0x04, 0x50, 0x61, 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x74, - 0x61, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, 0x12, 0x23, - 0x0a, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, - 0x69, 0x65, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x5f, 0x6e, 0x75, 0x6d, 0x62, - 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x74, 0x4e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x87, 0x02, 0x0a, 0x0f, 0x4c, 0x69, 0x73, - 0x74, 0x50, 0x61, 0x72, 0x74, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x16, 0x0a, 0x06, - 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x75, - 0x63, 0x6b, 0x65, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, - 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x70, 0x6c, 0x6f, 0x61, - 0x64, 0x49, 0x64, 0x12, 0x35, 0x0a, 0x17, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x74, - 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x72, 0x74, 0x4e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, - 0x78, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6d, - 0x61, 0x78, 0x50, 0x61, 0x72, 0x74, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x73, 0x5f, 0x74, 0x72, - 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, - 0x73, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x36, 0x0a, 0x05, 0x70, 0x61, - 0x72, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x73, 0x70, 0x65, 0x63, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, - 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x52, 0x05, 0x70, 0x61, 0x72, - 0x74, 0x73, 0x32, 0xcd, 0x18, 0x0a, 0x14, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x74, 0x6f, - 0x72, 0x61, 0x67, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x68, 0x0a, 0x09, 0x50, - 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x2a, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, - 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, - 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2b, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, - 0x33, 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, - 0x74, 0x22, 0x00, 0x28, 0x01, 0x12, 0x68, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x12, 0x2a, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, - 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2b, - 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, - 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x47, 0x65, 0x74, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, - 0x6f, 0x0a, 0x0c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, + 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x12, 0x23, 0x0a, + 0x0d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x62, + 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x13, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x75, 0x63, 0x6b, 0x65, + 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x6b, 0x65, 0x79, 0x5f, 0x6d, 0x61, + 0x72, 0x6b, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6b, 0x65, 0x79, 0x4d, + 0x61, 0x72, 0x6b, 0x65, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, 0x6b, 0x65, 0x79, + 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x4b, 0x65, 0x79, 0x73, + 0x12, 0x16, 0x0a, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x2a, 0x0a, 0x11, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x4d, 0x61, + 0x72, 0x6b, 0x65, 0x72, 0x22, 0xbf, 0x01, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, + 0x61, 0x72, 0x6b, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x73, + 0x5f, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, + 0x73, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x6c, 0x61, 0x73, + 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, 0x37, + 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, + 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x4f, 0x77, 0x6e, 0x65, 0x72, + 0x52, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x88, 0x02, 0x0a, 0x0d, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, 0x12, 0x1b, 0x0a, 0x09, + 0x69, 0x73, 0x5f, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x08, 0x69, 0x73, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x6c, + 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, + 0x12, 0x37, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x21, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x4f, 0x77, 0x6e, + 0x65, 0x72, 0x52, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, + 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x23, 0x0a, + 0x0d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6c, 0x61, + 0x73, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, + 0x64, 0x22, 0xb5, 0x04, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x27, + 0x0a, 0x0f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x50, + 0x72, 0x65, 0x66, 0x69, 0x78, 0x65, 0x73, 0x12, 0x54, 0x0a, 0x0e, 0x64, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2e, - 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, - 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, - 0x12, 0x69, 0x0a, 0x0a, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x2b, - 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, - 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x43, 0x6f, 0x70, 0x79, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2c, 0x2e, 0x73, 0x70, + 0x65, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, + 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x12, 0x1c, 0x0a, + 0x09, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x64, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x65, + 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0c, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x73, 0x5f, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x64, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, + 0x74, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6b, 0x65, 0x79, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, + 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6b, 0x65, 0x79, 0x4d, 0x61, 0x72, 0x6b, + 0x65, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x6d, 0x61, + 0x72, 0x6b, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, + 0x4b, 0x65, 0x79, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x12, 0x33, 0x0a, 0x16, 0x6e, 0x65, 0x78, + 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x5f, 0x6d, 0x61, 0x72, + 0x6b, 0x65, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x6e, 0x65, 0x78, 0x74, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x12, 0x16, + 0x0a, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x2a, 0x0a, 0x11, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x5f, 0x69, 0x64, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x4d, 0x61, 0x72, 0x6b, + 0x65, 0x72, 0x12, 0x45, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0d, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, + 0x33, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, + 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xe7, 0x04, 0x0a, 0x0f, 0x48, 0x65, + 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x1d, 0x0a, + 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, + 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x75, + 0x63, 0x6b, 0x65, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, + 0x75, 0x6d, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, + 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x65, + 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6f, + 0x77, 0x6e, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x65, 0x78, 0x70, 0x65, + 0x63, 0x74, 0x65, 0x64, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, + 0x19, 0x0a, 0x08, 0x69, 0x66, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x69, 0x66, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x2a, 0x0a, 0x11, 0x69, 0x66, + 0x5f, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x5f, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x69, 0x66, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, + 0x64, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x12, 0x22, 0x0a, 0x0d, 0x69, 0x66, 0x5f, 0x6e, 0x6f, 0x6e, + 0x65, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x69, + 0x66, 0x4e, 0x6f, 0x6e, 0x65, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x2e, 0x0a, 0x13, 0x69, 0x66, + 0x5f, 0x75, 0x6e, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x5f, 0x73, 0x69, 0x6e, 0x63, + 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x69, 0x66, 0x55, 0x6e, 0x6d, 0x6f, 0x64, + 0x69, 0x66, 0x69, 0x65, 0x64, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x61, + 0x72, 0x74, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0a, 0x70, 0x61, 0x72, 0x74, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x79, 0x65, 0x72, 0x18, 0x0b, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x79, 0x65, 0x72, + 0x12, 0x34, 0x0a, 0x16, 0x73, 0x73, 0x65, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, + 0x5f, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x14, 0x73, 0x73, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x41, 0x6c, 0x67, + 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x12, 0x28, 0x0a, 0x10, 0x73, 0x73, 0x65, 0x5f, 0x63, 0x75, + 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0e, 0x73, 0x73, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x4b, 0x65, 0x79, + 0x12, 0x2f, 0x0a, 0x14, 0x73, 0x73, 0x65, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, + 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x6d, 0x64, 0x35, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, + 0x73, 0x73, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x4b, 0x65, 0x79, 0x4d, 0x64, + 0x35, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, + 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, + 0x12, 0x21, 0x0a, 0x0c, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, + 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x77, 0x69, 0x74, 0x68, 0x44, 0x65, 0x74, 0x61, + 0x69, 0x6c, 0x73, 0x22, 0xc0, 0x01, 0x0a, 0x10, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x69, 0x0a, 0x0f, 0x72, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x40, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, + 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x48, + 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x2e, + 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x0e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x1a, 0x41, 0x0a, 0x13, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x7c, 0x0a, 0x12, 0x49, 0x73, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x1d, 0x0a, 0x0a, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x62, + 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x75, 0x63, + 0x6b, 0x65, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x34, 0x0a, 0x13, 0x49, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x45, 0x78, 0x69, 0x73, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x66, + 0x69, 0x6c, 0x65, 0x5f, 0x65, 0x78, 0x69, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x09, 0x66, 0x69, 0x6c, 0x65, 0x45, 0x78, 0x69, 0x73, 0x74, 0x22, 0x95, 0x01, 0x0a, 0x0c, 0x53, + 0x69, 0x67, 0x6e, 0x55, 0x52, 0x4c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, + 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, + 0x63, 0x6b, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, + 0x65, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x24, 0x0a, 0x0e, + 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x69, 0x6e, 0x5f, 0x73, 0x65, 0x63, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x64, 0x49, 0x6e, 0x53, + 0x65, 0x63, 0x22, 0x2e, 0x0a, 0x0d, 0x53, 0x69, 0x67, 0x6e, 0x55, 0x52, 0x4c, 0x4f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x75, 0x72, + 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x55, + 0x72, 0x6c, 0x22, 0xbc, 0x01, 0x0a, 0x1d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x61, 0x6e, + 0x64, 0x77, 0x69, 0x64, 0x74, 0x68, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x49, + 0x6e, 0x70, 0x75, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x48, 0x0a, 0x22, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x72, + 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x69, 0x6e, 0x5f, 0x62, 0x69, 0x74, + 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x1c, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, + 0x74, 0x49, 0x6e, 0x42, 0x69, 0x74, 0x73, 0x50, 0x65, 0x72, 0x53, 0x65, 0x63, 0x12, 0x32, 0x0a, + 0x15, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x67, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x61, 0x6d, + 0x65, 0x22, 0xcf, 0x04, 0x0a, 0x11, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, + 0x72, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, + 0x62, 0x6f, 0x64, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x10, 0x0a, 0x03, 0x61, 0x63, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x61, + 0x63, 0x6c, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x61, 0x63, 0x68, 0x65, + 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x2f, 0x0a, 0x13, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x44, 0x69, 0x73, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x5f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x63, 0x6f, 0x64, + 0x69, 0x6e, 0x67, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x6d, + 0x64, 0x35, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x4d, 0x64, 0x35, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x18, + 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x12, 0x23, + 0x0a, 0x0d, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, + 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x43, 0x6c, + 0x61, 0x73, 0x73, 0x12, 0x34, 0x0a, 0x16, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x73, 0x69, + 0x64, 0x65, 0x5f, 0x65, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0d, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x14, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x69, 0x64, 0x65, 0x45, + 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x65, 0x74, + 0x61, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6d, 0x65, 0x74, 0x61, 0x12, 0x4b, 0x0a, + 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, - 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x72, 0x0a, 0x0d, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x2e, 0x2e, 0x73, - 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, - 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2f, 0x2e, 0x73, + 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x2e, 0x54, 0x61, 0x67, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x54, 0x61, + 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0x3d, 0x0a, 0x12, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x61, 0x70, 0x70, + 0x65, 0x6e, 0x64, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x0e, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x9a, 0x02, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, 0x74, 0x73, + 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x6f, 0x72, 0x65, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x32, + 0x0a, 0x15, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, + 0x74, 0x5f, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x65, + 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4f, 0x77, 0x6e, + 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x73, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x50, 0x61, 0x72, 0x74, 0x73, 0x12, + 0x2c, 0x0a, 0x12, 0x70, 0x61, 0x72, 0x74, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x6d, + 0x61, 0x72, 0x6b, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x70, 0x61, 0x72, + 0x74, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x12, 0x23, 0x0a, + 0x0d, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x61, 0x79, 0x65, 0x72, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x50, 0x61, 0x79, + 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x22, + 0x74, 0x0a, 0x04, 0x50, 0x61, 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, 0x12, 0x23, 0x0a, 0x0d, 0x6c, + 0x61, 0x73, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, + 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x74, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x04, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x87, 0x02, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, + 0x72, 0x74, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, + 0x6b, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, + 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, + 0x12, 0x35, 0x0a, 0x17, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x5f, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x14, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x72, 0x74, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x70, + 0x61, 0x72, 0x74, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x50, + 0x61, 0x72, 0x74, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x73, 0x5f, 0x74, 0x72, 0x75, 0x6e, 0x63, + 0x61, 0x74, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x54, 0x72, + 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x36, 0x0a, 0x05, 0x70, 0x61, 0x72, 0x74, 0x73, + 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, + 0x2e, 0x73, 0x33, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x52, 0x05, 0x70, 0x61, 0x72, 0x74, 0x73, 0x32, + 0xcd, 0x18, 0x0a, 0x14, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, + 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x68, 0x0a, 0x09, 0x50, 0x75, 0x74, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x2a, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, + 0x73, 0x33, 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, + 0x74, 0x1a, 0x2b, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, + 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x50, + 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, + 0x28, 0x01, 0x12, 0x68, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, + 0x2a, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x47, 0x65, 0x74, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2b, 0x2e, 0x73, 0x70, + 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, + 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x6f, 0x0a, 0x0c, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x2d, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, - 0x6c, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x2c, - 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, - 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2d, 0x2e, 0x73, - 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, - 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x69, 0x0a, - 0x0a, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x2b, 0x2e, 0x73, 0x70, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2e, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, - 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, + 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x69, 0x0a, + 0x0a, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x2b, 0x2e, 0x73, 0x70, + 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, + 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2c, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, - 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x72, 0x0a, 0x0d, 0x49, 0x73, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x12, 0x2e, 0x2e, 0x73, 0x70, 0x65, 0x63, + 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x72, 0x0a, 0x0d, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x2e, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, - 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x49, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x45, - 0x78, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2f, 0x2e, 0x73, 0x70, 0x65, 0x63, + 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2f, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, - 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x49, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x45, - 0x78, 0x69, 0x73, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x7b, 0x0a, 0x10, - 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, - 0x12, 0x31, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, + 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x0b, + 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x2c, 0x2e, 0x73, 0x70, + 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, + 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2d, 0x2e, 0x73, 0x70, 0x65, 0x63, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, + 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x69, 0x0a, 0x0a, 0x48, 0x65, + 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x2b, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, + 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2c, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, + 0x73, 0x33, 0x2e, 0x48, 0x65, 0x61, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x72, 0x0a, 0x0d, 0x49, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x12, 0x2e, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, + 0x2e, 0x73, 0x33, 0x2e, 0x49, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x45, 0x78, 0x69, 0x73, + 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2f, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, + 0x2e, 0x73, 0x33, 0x2e, 0x49, 0x73, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x45, 0x78, 0x69, 0x73, + 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x7b, 0x0a, 0x10, 0x50, 0x75, 0x74, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x12, 0x31, 0x2e, + 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x70, 0x75, 0x74, + 0x1a, 0x32, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x50, 0x75, - 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x49, 0x6e, - 0x70, 0x75, 0x74, 0x1a, 0x32, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, - 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, - 0x67, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x84, 0x01, 0x0a, 0x13, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, - 0x67, 0x12, 0x34, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, - 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, - 0x6e, 0x67, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x35, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, - 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, - 0x12, 0x7b, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, - 0x67, 0x69, 0x6e, 0x67, 0x12, 0x31, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x4f, 0x75, + 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x84, 0x01, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x12, 0x34, + 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x49, + 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x35, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, + 0x33, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, + 0x67, 0x67, 0x69, 0x6e, 0x67, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x7b, 0x0a, + 0x10, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, + 0x67, 0x12, 0x31, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, + 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x47, + 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x49, + 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x32, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, 0x67, 0x67, 0x69, - 0x6e, 0x67, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x32, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, - 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x54, 0x61, - 0x67, 0x67, 0x69, 0x6e, 0x67, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x81, 0x01, - 0x0a, 0x12, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x61, 0x6e, 0x6e, 0x65, - 0x64, 0x41, 0x63, 0x6c, 0x12, 0x33, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6e, 0x67, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x81, 0x01, 0x0a, 0x12, 0x47, + 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x41, 0x63, + 0x6c, 0x12, 0x33, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, + 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x47, + 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x41, 0x63, + 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x34, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, + 0x2e, 0x73, 0x33, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x61, 0x6e, + 0x6e, 0x65, 0x64, 0x41, 0x63, 0x6c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x81, + 0x01, 0x0a, 0x12, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x61, 0x6e, 0x6e, + 0x65, 0x64, 0x41, 0x63, 0x6c, 0x12, 0x33, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, + 0x73, 0x33, 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x61, 0x6e, 0x6e, + 0x65, 0x64, 0x41, 0x63, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x34, 0x2e, 0x73, 0x70, 0x65, + 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x43, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x41, 0x63, 0x6c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x22, 0x00, 0x12, 0x8a, 0x01, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x75, 0x6c, + 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x36, 0x2e, 0x73, + 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, + 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x49, + 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x37, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, - 0x33, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x61, 0x6e, 0x6e, 0x65, - 0x64, 0x41, 0x63, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x34, 0x2e, 0x73, 0x70, 0x65, 0x63, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, - 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x43, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x41, 0x63, 0x6c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, - 0x00, 0x12, 0x81, 0x01, 0x0a, 0x12, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, - 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x41, 0x63, 0x6c, 0x12, 0x33, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, - 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, - 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x41, 0x63, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x34, 0x2e, + 0x33, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, + 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, + 0x6b, 0x0a, 0x0a, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x12, 0x2b, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, - 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x50, 0x75, 0x74, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x43, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x41, 0x63, 0x6c, 0x4f, 0x75, 0x74, - 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x8a, 0x01, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, + 0x64, 0x50, 0x61, 0x72, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2c, 0x2e, 0x73, 0x70, 0x65, + 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, + 0x72, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x28, 0x01, 0x12, 0x75, 0x0a, 0x0e, + 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, 0x12, 0x2f, + 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x55, 0x70, 0x6c, 0x6f, + 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, + 0x30, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x55, 0x70, 0x6c, + 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x75, 0x74, 0x70, 0x75, + 0x74, 0x22, 0x00, 0x12, 0x90, 0x01, 0x0a, 0x17, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, + 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, + 0x38, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x43, 0x6f, 0x6d, + 0x70, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, + 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x39, 0x2e, 0x73, 0x70, 0x65, 0x63, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, + 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x4d, + 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x75, + 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x87, 0x01, 0x0a, 0x14, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, - 0x36, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, - 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, - 0x61, 0x64, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x37, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, + 0x35, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x41, 0x62, 0x6f, + 0x72, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, + 0x64, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x36, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, + 0x2e, 0x73, 0x33, 0x2e, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, + 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, + 0x12, 0x87, 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, + 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x35, 0x2e, 0x73, 0x70, 0x65, 0x63, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, + 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, + 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, + 0x1a, 0x36, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, + 0x64, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x09, 0x4c, 0x69, + 0x73, 0x74, 0x50, 0x61, 0x72, 0x74, 0x73, 0x12, 0x2a, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, - 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, - 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, - 0x22, 0x00, 0x12, 0x6b, 0x0a, 0x0a, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, - 0x12, 0x2b, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, - 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x55, 0x70, - 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2c, 0x2e, - 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, - 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, - 0x64, 0x50, 0x61, 0x72, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x28, 0x01, 0x12, - 0x75, 0x0a, 0x0e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, - 0x79, 0x12, 0x2f, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, - 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x55, - 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, 0x49, 0x6e, 0x70, - 0x75, 0x74, 0x1a, 0x30, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, - 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x75, - 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x90, 0x01, 0x0a, 0x17, 0x43, 0x6f, 0x6d, 0x70, 0x6c, - 0x65, 0x74, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, - 0x61, 0x64, 0x12, 0x38, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, - 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, - 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x39, 0x2e, 0x73, - 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, - 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, - 0x74, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, - 0x64, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x87, 0x01, 0x0a, 0x14, 0x41, 0x62, - 0x6f, 0x72, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, - 0x61, 0x64, 0x12, 0x35, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, - 0x41, 0x62, 0x6f, 0x72, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, - 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x36, 0x2e, 0x73, 0x70, 0x65, 0x63, + 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, 0x74, 0x73, 0x49, 0x6e, + 0x70, 0x75, 0x74, 0x1a, 0x2b, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, 0x74, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x22, 0x00, 0x12, 0x81, 0x01, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x33, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, - 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x4d, 0x75, 0x6c, 0x74, - 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x75, 0x74, 0x70, 0x75, - 0x74, 0x22, 0x00, 0x12, 0x87, 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x75, 0x6c, 0x74, - 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x35, 0x2e, 0x73, + 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x34, + 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x4f, 0x75, + 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x07, 0x53, 0x69, 0x67, 0x6e, 0x55, 0x52, + 0x4c, 0x12, 0x28, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, + 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x53, + 0x69, 0x67, 0x6e, 0x55, 0x52, 0x4c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x29, 0x2e, 0x73, 0x70, + 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, + 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x55, 0x52, 0x4c, + 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x77, 0x0a, 0x20, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6e, 0x64, 0x77, 0x69, + 0x64, 0x74, 0x68, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x39, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, - 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x75, - 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x49, 0x6e, - 0x70, 0x75, 0x74, 0x1a, 0x36, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x42, 0x61, 0x6e, 0x64, 0x77, 0x69, 0x64, 0x74, 0x68, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, + 0x69, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 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, 0x75, 0x0a, 0x1e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x70, 0x6c, 0x6f, 0x61, + 0x64, 0x42, 0x61, 0x6e, 0x64, 0x77, 0x69, 0x64, 0x74, 0x68, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, + 0x6d, 0x69, 0x74, 0x12, 0x39, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x61, 0x72, 0x74, 0x55, 0x70, - 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x66, 0x0a, - 0x09, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, 0x74, 0x73, 0x12, 0x2a, 0x2e, 0x73, 0x70, 0x65, - 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, - 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, 0x74, - 0x73, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2b, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, - 0x2e, 0x73, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x61, 0x72, 0x74, 0x73, 0x4f, 0x75, 0x74, - 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x81, 0x01, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x33, 0x2e, 0x73, + 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x61, 0x6e, 0x64, 0x77, 0x69, 0x64, 0x74, 0x68, + 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 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, 0x71, 0x0a, 0x0c, 0x41, 0x70, 0x70, 0x65, + 0x6e, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x2d, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, + 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2e, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, + 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x28, 0x01, 0x12, 0x72, 0x0a, 0x0d, 0x52, + 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x2e, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, - 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x49, 0x6e, 0x70, 0x75, - 0x74, 0x1a, 0x34, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, - 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x4c, - 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x73, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x07, 0x53, 0x69, 0x67, - 0x6e, 0x55, 0x52, 0x4c, 0x12, 0x28, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, - 0x33, 0x2e, 0x53, 0x69, 0x67, 0x6e, 0x55, 0x52, 0x4c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x29, - 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, - 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x53, 0x69, 0x67, 0x6e, - 0x55, 0x52, 0x4c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x12, 0x77, 0x0a, 0x20, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6e, - 0x64, 0x77, 0x69, 0x64, 0x74, 0x68, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, - 0x39, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, - 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x42, 0x61, 0x6e, 0x64, 0x77, 0x69, 0x64, 0x74, 0x68, 0x52, 0x61, 0x74, 0x65, - 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 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, 0x75, 0x0a, 0x1e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x70, - 0x6c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6e, 0x64, 0x77, 0x69, 0x64, 0x74, 0x68, 0x52, 0x61, 0x74, - 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x39, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, - 0x2e, 0x73, 0x33, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x42, 0x61, 0x6e, 0x64, 0x77, 0x69, - 0x64, 0x74, 0x68, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x49, 0x6e, 0x70, 0x75, - 0x74, 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, 0x71, 0x0a, 0x0c, 0x41, - 0x70, 0x70, 0x65, 0x6e, 0x64, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x2d, 0x2e, 0x73, 0x70, - 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, - 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2e, 0x2e, 0x73, 0x70, 0x65, - 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, - 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x41, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x28, 0x01, 0x12, 0x72, - 0x0a, 0x0d, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, - 0x2e, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, - 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x52, 0x65, 0x73, - 0x74, 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, - 0x2f, 0x2e, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, - 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x52, 0x65, 0x73, - 0x74, 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, - 0x22, 0x00, 0x42, 0x2f, 0x5a, 0x2d, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x69, 0x6f, 0x2f, 0x6c, 0x61, - 0x79, 0x6f, 0x74, 0x74, 0x6f, 0x2f, 0x73, 0x70, 0x65, 0x63, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x2f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x33, - 0x3b, 0x73, 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, + 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x2f, 0x2e, 0x73, + 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, + 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, + 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x42, + 0x2f, 0x5a, 0x2d, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x69, 0x6f, 0x2f, 0x6c, 0x61, 0x79, 0x6f, 0x74, + 0x74, 0x6f, 0x2f, 0x73, 0x70, 0x65, 0x63, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x33, 0x3b, 0x73, 0x33, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -7794,7 +8559,7 @@ func file_oss_proto_rawDescGZIP() []byte { return file_oss_proto_rawDescData } -var file_oss_proto_msgTypes = make([]protoimpl.MessageInfo, 78) +var file_oss_proto_msgTypes = make([]protoimpl.MessageInfo, 86) var file_oss_proto_goTypes = []interface{}{ (*GetObjectInput)(nil), // 0: spec.proto.extension.v1.s3.GetObjectInput (*GetObjectOutput)(nil), // 1: spec.proto.extension.v1.s3.GetObjectOutput @@ -7825,69 +8590,77 @@ var file_oss_proto_goTypes = []interface{}{ (*GetObjectCannedAclOutput)(nil), // 26: spec.proto.extension.v1.s3.GetObjectCannedAclOutput (*PutObjectCannedAclInput)(nil), // 27: spec.proto.extension.v1.s3.PutObjectCannedAclInput (*PutObjectCannedAclOutput)(nil), // 28: spec.proto.extension.v1.s3.PutObjectCannedAclOutput - (*RestoreObjectInput)(nil), // 29: spec.proto.extension.v1.s3.RestoreObjectInput - (*RestoreObjectOutput)(nil), // 30: spec.proto.extension.v1.s3.RestoreObjectOutput - (*CreateMultipartUploadInput)(nil), // 31: spec.proto.extension.v1.s3.CreateMultipartUploadInput - (*CreateMultipartUploadOutput)(nil), // 32: spec.proto.extension.v1.s3.CreateMultipartUploadOutput - (*UploadPartInput)(nil), // 33: spec.proto.extension.v1.s3.UploadPartInput - (*UploadPartOutput)(nil), // 34: spec.proto.extension.v1.s3.UploadPartOutput - (*UploadPartCopyInput)(nil), // 35: spec.proto.extension.v1.s3.UploadPartCopyInput - (*CopyPartResult)(nil), // 36: spec.proto.extension.v1.s3.CopyPartResult - (*UploadPartCopyOutput)(nil), // 37: spec.proto.extension.v1.s3.UploadPartCopyOutput - (*CompletedPart)(nil), // 38: spec.proto.extension.v1.s3.CompletedPart - (*CompletedMultipartUpload)(nil), // 39: spec.proto.extension.v1.s3.CompletedMultipartUpload - (*CompleteMultipartUploadInput)(nil), // 40: spec.proto.extension.v1.s3.CompleteMultipartUploadInput - (*CompleteMultipartUploadOutput)(nil), // 41: spec.proto.extension.v1.s3.CompleteMultipartUploadOutput - (*AbortMultipartUploadInput)(nil), // 42: spec.proto.extension.v1.s3.AbortMultipartUploadInput - (*AbortMultipartUploadOutput)(nil), // 43: spec.proto.extension.v1.s3.AbortMultipartUploadOutput - (*ListMultipartUploadsInput)(nil), // 44: spec.proto.extension.v1.s3.ListMultipartUploadsInput - (*Initiator)(nil), // 45: spec.proto.extension.v1.s3.Initiator - (*MultipartUpload)(nil), // 46: spec.proto.extension.v1.s3.MultipartUpload - (*ListMultipartUploadsOutput)(nil), // 47: spec.proto.extension.v1.s3.ListMultipartUploadsOutput - (*ListObjectVersionsInput)(nil), // 48: spec.proto.extension.v1.s3.ListObjectVersionsInput - (*DeleteMarkerEntry)(nil), // 49: spec.proto.extension.v1.s3.DeleteMarkerEntry - (*ObjectVersion)(nil), // 50: spec.proto.extension.v1.s3.ObjectVersion - (*ListObjectVersionsOutput)(nil), // 51: spec.proto.extension.v1.s3.ListObjectVersionsOutput - (*HeadObjectInput)(nil), // 52: spec.proto.extension.v1.s3.HeadObjectInput - (*HeadObjectOutput)(nil), // 53: spec.proto.extension.v1.s3.HeadObjectOutput - (*IsObjectExistInput)(nil), // 54: spec.proto.extension.v1.s3.IsObjectExistInput - (*IsObjectExistOutput)(nil), // 55: spec.proto.extension.v1.s3.IsObjectExistOutput - (*SignURLInput)(nil), // 56: spec.proto.extension.v1.s3.SignURLInput - (*SignURLOutput)(nil), // 57: spec.proto.extension.v1.s3.SignURLOutput - (*UpdateBandwidthRateLimitInput)(nil), // 58: spec.proto.extension.v1.s3.UpdateBandwidthRateLimitInput - (*AppendObjectInput)(nil), // 59: spec.proto.extension.v1.s3.AppendObjectInput - (*AppendObjectOutput)(nil), // 60: spec.proto.extension.v1.s3.AppendObjectOutput - (*ListPartsInput)(nil), // 61: spec.proto.extension.v1.s3.ListPartsInput - (*Part)(nil), // 62: spec.proto.extension.v1.s3.Part - (*ListPartsOutput)(nil), // 63: spec.proto.extension.v1.s3.ListPartsOutput - nil, // 64: spec.proto.extension.v1.s3.GetObjectOutput.MetadataEntry - nil, // 65: spec.proto.extension.v1.s3.PutObjectInput.MetaEntry - nil, // 66: spec.proto.extension.v1.s3.PutObjectInput.TaggingEntry - nil, // 67: spec.proto.extension.v1.s3.PutObjectTaggingInput.TagsEntry - nil, // 68: spec.proto.extension.v1.s3.PutObjectTaggingOutput.ResultMetadataEntry - nil, // 69: spec.proto.extension.v1.s3.DeleteObjectTaggingOutput.ResultMetadataEntry - nil, // 70: spec.proto.extension.v1.s3.GetObjectTaggingOutput.TagsEntry - nil, // 71: spec.proto.extension.v1.s3.GetObjectTaggingOutput.ResultMetadataEntry - nil, // 72: spec.proto.extension.v1.s3.CopyObjectInput.TaggingEntry - nil, // 73: spec.proto.extension.v1.s3.CopyObjectInput.MetadataEntry - nil, // 74: spec.proto.extension.v1.s3.CreateMultipartUploadInput.MetaDataEntry - nil, // 75: spec.proto.extension.v1.s3.CreateMultipartUploadInput.TaggingEntry - nil, // 76: spec.proto.extension.v1.s3.HeadObjectOutput.ResultMetadataEntry - nil, // 77: spec.proto.extension.v1.s3.AppendObjectInput.TagsEntry - (*emptypb.Empty)(nil), // 78: google.protobuf.Empty + (*GlacierJobParameters)(nil), // 29: spec.proto.extension.v1.s3.GlacierJobParameters + (*OutputLocation)(nil), // 30: spec.proto.extension.v1.s3.OutputLocation + (*CSVInput)(nil), // 31: spec.proto.extension.v1.s3.CSVInput + (*InputSerialization)(nil), // 32: spec.proto.extension.v1.s3.InputSerialization + (*CSVOutput)(nil), // 33: spec.proto.extension.v1.s3.CSVOutput + (*OutputSerialization)(nil), // 34: spec.proto.extension.v1.s3.OutputSerialization + (*SelectParameters)(nil), // 35: spec.proto.extension.v1.s3.SelectParameters + (*RestoreRequest)(nil), // 36: spec.proto.extension.v1.s3.RestoreRequest + (*RestoreObjectInput)(nil), // 37: spec.proto.extension.v1.s3.RestoreObjectInput + (*RestoreObjectOutput)(nil), // 38: spec.proto.extension.v1.s3.RestoreObjectOutput + (*CreateMultipartUploadInput)(nil), // 39: spec.proto.extension.v1.s3.CreateMultipartUploadInput + (*CreateMultipartUploadOutput)(nil), // 40: spec.proto.extension.v1.s3.CreateMultipartUploadOutput + (*UploadPartInput)(nil), // 41: spec.proto.extension.v1.s3.UploadPartInput + (*UploadPartOutput)(nil), // 42: spec.proto.extension.v1.s3.UploadPartOutput + (*UploadPartCopyInput)(nil), // 43: spec.proto.extension.v1.s3.UploadPartCopyInput + (*CopyPartResult)(nil), // 44: spec.proto.extension.v1.s3.CopyPartResult + (*UploadPartCopyOutput)(nil), // 45: spec.proto.extension.v1.s3.UploadPartCopyOutput + (*CompletedPart)(nil), // 46: spec.proto.extension.v1.s3.CompletedPart + (*CompletedMultipartUpload)(nil), // 47: spec.proto.extension.v1.s3.CompletedMultipartUpload + (*CompleteMultipartUploadInput)(nil), // 48: spec.proto.extension.v1.s3.CompleteMultipartUploadInput + (*CompleteMultipartUploadOutput)(nil), // 49: spec.proto.extension.v1.s3.CompleteMultipartUploadOutput + (*AbortMultipartUploadInput)(nil), // 50: spec.proto.extension.v1.s3.AbortMultipartUploadInput + (*AbortMultipartUploadOutput)(nil), // 51: spec.proto.extension.v1.s3.AbortMultipartUploadOutput + (*ListMultipartUploadsInput)(nil), // 52: spec.proto.extension.v1.s3.ListMultipartUploadsInput + (*Initiator)(nil), // 53: spec.proto.extension.v1.s3.Initiator + (*MultipartUpload)(nil), // 54: spec.proto.extension.v1.s3.MultipartUpload + (*ListMultipartUploadsOutput)(nil), // 55: spec.proto.extension.v1.s3.ListMultipartUploadsOutput + (*ListObjectVersionsInput)(nil), // 56: spec.proto.extension.v1.s3.ListObjectVersionsInput + (*DeleteMarkerEntry)(nil), // 57: spec.proto.extension.v1.s3.DeleteMarkerEntry + (*ObjectVersion)(nil), // 58: spec.proto.extension.v1.s3.ObjectVersion + (*ListObjectVersionsOutput)(nil), // 59: spec.proto.extension.v1.s3.ListObjectVersionsOutput + (*HeadObjectInput)(nil), // 60: spec.proto.extension.v1.s3.HeadObjectInput + (*HeadObjectOutput)(nil), // 61: spec.proto.extension.v1.s3.HeadObjectOutput + (*IsObjectExistInput)(nil), // 62: spec.proto.extension.v1.s3.IsObjectExistInput + (*IsObjectExistOutput)(nil), // 63: spec.proto.extension.v1.s3.IsObjectExistOutput + (*SignURLInput)(nil), // 64: spec.proto.extension.v1.s3.SignURLInput + (*SignURLOutput)(nil), // 65: spec.proto.extension.v1.s3.SignURLOutput + (*UpdateBandwidthRateLimitInput)(nil), // 66: spec.proto.extension.v1.s3.UpdateBandwidthRateLimitInput + (*AppendObjectInput)(nil), // 67: spec.proto.extension.v1.s3.AppendObjectInput + (*AppendObjectOutput)(nil), // 68: spec.proto.extension.v1.s3.AppendObjectOutput + (*ListPartsInput)(nil), // 69: spec.proto.extension.v1.s3.ListPartsInput + (*Part)(nil), // 70: spec.proto.extension.v1.s3.Part + (*ListPartsOutput)(nil), // 71: spec.proto.extension.v1.s3.ListPartsOutput + nil, // 72: spec.proto.extension.v1.s3.GetObjectOutput.MetadataEntry + nil, // 73: spec.proto.extension.v1.s3.PutObjectInput.MetaEntry + nil, // 74: spec.proto.extension.v1.s3.PutObjectInput.TaggingEntry + nil, // 75: spec.proto.extension.v1.s3.PutObjectTaggingInput.TagsEntry + nil, // 76: spec.proto.extension.v1.s3.PutObjectTaggingOutput.ResultMetadataEntry + nil, // 77: spec.proto.extension.v1.s3.DeleteObjectTaggingOutput.ResultMetadataEntry + nil, // 78: spec.proto.extension.v1.s3.GetObjectTaggingOutput.TagsEntry + nil, // 79: spec.proto.extension.v1.s3.GetObjectTaggingOutput.ResultMetadataEntry + nil, // 80: spec.proto.extension.v1.s3.CopyObjectInput.TaggingEntry + nil, // 81: spec.proto.extension.v1.s3.CopyObjectInput.MetadataEntry + nil, // 82: spec.proto.extension.v1.s3.CreateMultipartUploadInput.MetaDataEntry + nil, // 83: spec.proto.extension.v1.s3.CreateMultipartUploadInput.TaggingEntry + nil, // 84: spec.proto.extension.v1.s3.HeadObjectOutput.ResultMetadataEntry + nil, // 85: spec.proto.extension.v1.s3.AppendObjectInput.TagsEntry + (*emptypb.Empty)(nil), // 86: google.protobuf.Empty } var file_oss_proto_depIdxs = []int32{ - 64, // 0: spec.proto.extension.v1.s3.GetObjectOutput.metadata:type_name -> spec.proto.extension.v1.s3.GetObjectOutput.MetadataEntry - 65, // 1: spec.proto.extension.v1.s3.PutObjectInput.meta:type_name -> spec.proto.extension.v1.s3.PutObjectInput.MetaEntry - 66, // 2: spec.proto.extension.v1.s3.PutObjectInput.tagging:type_name -> spec.proto.extension.v1.s3.PutObjectInput.TaggingEntry - 67, // 3: spec.proto.extension.v1.s3.PutObjectTaggingInput.tags:type_name -> spec.proto.extension.v1.s3.PutObjectTaggingInput.TagsEntry - 68, // 4: spec.proto.extension.v1.s3.PutObjectTaggingOutput.result_metadata:type_name -> spec.proto.extension.v1.s3.PutObjectTaggingOutput.ResultMetadataEntry - 69, // 5: spec.proto.extension.v1.s3.DeleteObjectTaggingOutput.result_metadata:type_name -> spec.proto.extension.v1.s3.DeleteObjectTaggingOutput.ResultMetadataEntry - 70, // 6: spec.proto.extension.v1.s3.GetObjectTaggingOutput.tags:type_name -> spec.proto.extension.v1.s3.GetObjectTaggingOutput.TagsEntry - 71, // 7: spec.proto.extension.v1.s3.GetObjectTaggingOutput.result_metadata:type_name -> spec.proto.extension.v1.s3.GetObjectTaggingOutput.ResultMetadataEntry + 72, // 0: spec.proto.extension.v1.s3.GetObjectOutput.metadata:type_name -> spec.proto.extension.v1.s3.GetObjectOutput.MetadataEntry + 73, // 1: spec.proto.extension.v1.s3.PutObjectInput.meta:type_name -> spec.proto.extension.v1.s3.PutObjectInput.MetaEntry + 74, // 2: spec.proto.extension.v1.s3.PutObjectInput.tagging:type_name -> spec.proto.extension.v1.s3.PutObjectInput.TaggingEntry + 75, // 3: spec.proto.extension.v1.s3.PutObjectTaggingInput.tags:type_name -> spec.proto.extension.v1.s3.PutObjectTaggingInput.TagsEntry + 76, // 4: spec.proto.extension.v1.s3.PutObjectTaggingOutput.result_metadata:type_name -> spec.proto.extension.v1.s3.PutObjectTaggingOutput.ResultMetadataEntry + 77, // 5: spec.proto.extension.v1.s3.DeleteObjectTaggingOutput.result_metadata:type_name -> spec.proto.extension.v1.s3.DeleteObjectTaggingOutput.ResultMetadataEntry + 78, // 6: spec.proto.extension.v1.s3.GetObjectTaggingOutput.tags:type_name -> spec.proto.extension.v1.s3.GetObjectTaggingOutput.TagsEntry + 79, // 7: spec.proto.extension.v1.s3.GetObjectTaggingOutput.result_metadata:type_name -> spec.proto.extension.v1.s3.GetObjectTaggingOutput.ResultMetadataEntry 12, // 8: spec.proto.extension.v1.s3.CopyObjectInput.copy_source:type_name -> spec.proto.extension.v1.s3.CopySource - 72, // 9: spec.proto.extension.v1.s3.CopyObjectInput.tagging:type_name -> spec.proto.extension.v1.s3.CopyObjectInput.TaggingEntry - 73, // 10: spec.proto.extension.v1.s3.CopyObjectInput.metadata:type_name -> spec.proto.extension.v1.s3.CopyObjectInput.MetadataEntry + 80, // 9: spec.proto.extension.v1.s3.CopyObjectInput.tagging:type_name -> spec.proto.extension.v1.s3.CopyObjectInput.TaggingEntry + 81, // 10: spec.proto.extension.v1.s3.CopyObjectInput.metadata:type_name -> spec.proto.extension.v1.s3.CopyObjectInput.MetadataEntry 14, // 11: spec.proto.extension.v1.s3.CopyObjectOutput.copy_object_result:type_name -> spec.proto.extension.v1.s3.CopyObjectResult 17, // 12: spec.proto.extension.v1.s3.Delete.objects:type_name -> spec.proto.extension.v1.s3.ObjectIdentifier 16, // 13: spec.proto.extension.v1.s3.DeleteObjectsInput.delete:type_name -> spec.proto.extension.v1.s3.Delete @@ -7895,79 +8668,87 @@ var file_oss_proto_depIdxs = []int32{ 24, // 15: spec.proto.extension.v1.s3.ListObjectsOutput.contents:type_name -> spec.proto.extension.v1.s3.Object 23, // 16: spec.proto.extension.v1.s3.Object.owner:type_name -> spec.proto.extension.v1.s3.Owner 23, // 17: spec.proto.extension.v1.s3.GetObjectCannedAclOutput.owner:type_name -> spec.proto.extension.v1.s3.Owner - 74, // 18: spec.proto.extension.v1.s3.CreateMultipartUploadInput.meta_data:type_name -> spec.proto.extension.v1.s3.CreateMultipartUploadInput.MetaDataEntry - 75, // 19: spec.proto.extension.v1.s3.CreateMultipartUploadInput.tagging:type_name -> spec.proto.extension.v1.s3.CreateMultipartUploadInput.TaggingEntry - 12, // 20: spec.proto.extension.v1.s3.UploadPartCopyInput.copy_source:type_name -> spec.proto.extension.v1.s3.CopySource - 36, // 21: spec.proto.extension.v1.s3.UploadPartCopyOutput.copy_part_result:type_name -> spec.proto.extension.v1.s3.CopyPartResult - 38, // 22: spec.proto.extension.v1.s3.CompletedMultipartUpload.parts:type_name -> spec.proto.extension.v1.s3.CompletedPart - 39, // 23: spec.proto.extension.v1.s3.CompleteMultipartUploadInput.multipart_upload:type_name -> spec.proto.extension.v1.s3.CompletedMultipartUpload - 45, // 24: spec.proto.extension.v1.s3.MultipartUpload.initiator:type_name -> spec.proto.extension.v1.s3.Initiator - 23, // 25: spec.proto.extension.v1.s3.MultipartUpload.owner:type_name -> spec.proto.extension.v1.s3.Owner - 46, // 26: spec.proto.extension.v1.s3.ListMultipartUploadsOutput.uploads:type_name -> spec.proto.extension.v1.s3.MultipartUpload - 23, // 27: spec.proto.extension.v1.s3.DeleteMarkerEntry.owner:type_name -> spec.proto.extension.v1.s3.Owner - 23, // 28: spec.proto.extension.v1.s3.ObjectVersion.owner:type_name -> spec.proto.extension.v1.s3.Owner - 49, // 29: spec.proto.extension.v1.s3.ListObjectVersionsOutput.delete_markers:type_name -> spec.proto.extension.v1.s3.DeleteMarkerEntry - 50, // 30: spec.proto.extension.v1.s3.ListObjectVersionsOutput.versions:type_name -> spec.proto.extension.v1.s3.ObjectVersion - 76, // 31: spec.proto.extension.v1.s3.HeadObjectOutput.result_metadata:type_name -> spec.proto.extension.v1.s3.HeadObjectOutput.ResultMetadataEntry - 77, // 32: spec.proto.extension.v1.s3.AppendObjectInput.tags:type_name -> spec.proto.extension.v1.s3.AppendObjectInput.TagsEntry - 62, // 33: spec.proto.extension.v1.s3.ListPartsOutput.parts:type_name -> spec.proto.extension.v1.s3.Part - 2, // 34: spec.proto.extension.v1.s3.ObjectStorageService.PutObject:input_type -> spec.proto.extension.v1.s3.PutObjectInput - 0, // 35: spec.proto.extension.v1.s3.ObjectStorageService.GetObject:input_type -> spec.proto.extension.v1.s3.GetObjectInput - 4, // 36: spec.proto.extension.v1.s3.ObjectStorageService.DeleteObject:input_type -> spec.proto.extension.v1.s3.DeleteObjectInput - 13, // 37: spec.proto.extension.v1.s3.ObjectStorageService.CopyObject:input_type -> spec.proto.extension.v1.s3.CopyObjectInput - 18, // 38: spec.proto.extension.v1.s3.ObjectStorageService.DeleteObjects:input_type -> spec.proto.extension.v1.s3.DeleteObjectsInput - 21, // 39: spec.proto.extension.v1.s3.ObjectStorageService.ListObjects:input_type -> spec.proto.extension.v1.s3.ListObjectsInput - 52, // 40: spec.proto.extension.v1.s3.ObjectStorageService.HeadObject:input_type -> spec.proto.extension.v1.s3.HeadObjectInput - 54, // 41: spec.proto.extension.v1.s3.ObjectStorageService.IsObjectExist:input_type -> spec.proto.extension.v1.s3.IsObjectExistInput - 6, // 42: spec.proto.extension.v1.s3.ObjectStorageService.PutObjectTagging:input_type -> spec.proto.extension.v1.s3.PutObjectTaggingInput - 8, // 43: spec.proto.extension.v1.s3.ObjectStorageService.DeleteObjectTagging:input_type -> spec.proto.extension.v1.s3.DeleteObjectTaggingInput - 10, // 44: spec.proto.extension.v1.s3.ObjectStorageService.GetObjectTagging:input_type -> spec.proto.extension.v1.s3.GetObjectTaggingInput - 25, // 45: spec.proto.extension.v1.s3.ObjectStorageService.GetObjectCannedAcl:input_type -> spec.proto.extension.v1.s3.GetObjectCannedAclInput - 27, // 46: spec.proto.extension.v1.s3.ObjectStorageService.PutObjectCannedAcl:input_type -> spec.proto.extension.v1.s3.PutObjectCannedAclInput - 31, // 47: spec.proto.extension.v1.s3.ObjectStorageService.CreateMultipartUpload:input_type -> spec.proto.extension.v1.s3.CreateMultipartUploadInput - 33, // 48: spec.proto.extension.v1.s3.ObjectStorageService.UploadPart:input_type -> spec.proto.extension.v1.s3.UploadPartInput - 35, // 49: spec.proto.extension.v1.s3.ObjectStorageService.UploadPartCopy:input_type -> spec.proto.extension.v1.s3.UploadPartCopyInput - 40, // 50: spec.proto.extension.v1.s3.ObjectStorageService.CompleteMultipartUpload:input_type -> spec.proto.extension.v1.s3.CompleteMultipartUploadInput - 42, // 51: spec.proto.extension.v1.s3.ObjectStorageService.AbortMultipartUpload:input_type -> spec.proto.extension.v1.s3.AbortMultipartUploadInput - 44, // 52: spec.proto.extension.v1.s3.ObjectStorageService.ListMultipartUploads:input_type -> spec.proto.extension.v1.s3.ListMultipartUploadsInput - 61, // 53: spec.proto.extension.v1.s3.ObjectStorageService.ListParts:input_type -> spec.proto.extension.v1.s3.ListPartsInput - 48, // 54: spec.proto.extension.v1.s3.ObjectStorageService.ListObjectVersions:input_type -> spec.proto.extension.v1.s3.ListObjectVersionsInput - 56, // 55: spec.proto.extension.v1.s3.ObjectStorageService.SignURL:input_type -> spec.proto.extension.v1.s3.SignURLInput - 58, // 56: spec.proto.extension.v1.s3.ObjectStorageService.UpdateDownloadBandwidthRateLimit:input_type -> spec.proto.extension.v1.s3.UpdateBandwidthRateLimitInput - 58, // 57: spec.proto.extension.v1.s3.ObjectStorageService.UpdateUploadBandwidthRateLimit:input_type -> spec.proto.extension.v1.s3.UpdateBandwidthRateLimitInput - 59, // 58: spec.proto.extension.v1.s3.ObjectStorageService.AppendObject:input_type -> spec.proto.extension.v1.s3.AppendObjectInput - 29, // 59: spec.proto.extension.v1.s3.ObjectStorageService.RestoreObject:input_type -> spec.proto.extension.v1.s3.RestoreObjectInput - 3, // 60: spec.proto.extension.v1.s3.ObjectStorageService.PutObject:output_type -> spec.proto.extension.v1.s3.PutObjectOutput - 1, // 61: spec.proto.extension.v1.s3.ObjectStorageService.GetObject:output_type -> spec.proto.extension.v1.s3.GetObjectOutput - 5, // 62: spec.proto.extension.v1.s3.ObjectStorageService.DeleteObject:output_type -> spec.proto.extension.v1.s3.DeleteObjectOutput - 15, // 63: spec.proto.extension.v1.s3.ObjectStorageService.CopyObject:output_type -> spec.proto.extension.v1.s3.CopyObjectOutput - 20, // 64: spec.proto.extension.v1.s3.ObjectStorageService.DeleteObjects:output_type -> spec.proto.extension.v1.s3.DeleteObjectsOutput - 22, // 65: spec.proto.extension.v1.s3.ObjectStorageService.ListObjects:output_type -> spec.proto.extension.v1.s3.ListObjectsOutput - 53, // 66: spec.proto.extension.v1.s3.ObjectStorageService.HeadObject:output_type -> spec.proto.extension.v1.s3.HeadObjectOutput - 55, // 67: spec.proto.extension.v1.s3.ObjectStorageService.IsObjectExist:output_type -> spec.proto.extension.v1.s3.IsObjectExistOutput - 7, // 68: spec.proto.extension.v1.s3.ObjectStorageService.PutObjectTagging:output_type -> spec.proto.extension.v1.s3.PutObjectTaggingOutput - 9, // 69: spec.proto.extension.v1.s3.ObjectStorageService.DeleteObjectTagging:output_type -> spec.proto.extension.v1.s3.DeleteObjectTaggingOutput - 11, // 70: spec.proto.extension.v1.s3.ObjectStorageService.GetObjectTagging:output_type -> spec.proto.extension.v1.s3.GetObjectTaggingOutput - 26, // 71: spec.proto.extension.v1.s3.ObjectStorageService.GetObjectCannedAcl:output_type -> spec.proto.extension.v1.s3.GetObjectCannedAclOutput - 28, // 72: spec.proto.extension.v1.s3.ObjectStorageService.PutObjectCannedAcl:output_type -> spec.proto.extension.v1.s3.PutObjectCannedAclOutput - 32, // 73: spec.proto.extension.v1.s3.ObjectStorageService.CreateMultipartUpload:output_type -> spec.proto.extension.v1.s3.CreateMultipartUploadOutput - 34, // 74: spec.proto.extension.v1.s3.ObjectStorageService.UploadPart:output_type -> spec.proto.extension.v1.s3.UploadPartOutput - 37, // 75: spec.proto.extension.v1.s3.ObjectStorageService.UploadPartCopy:output_type -> spec.proto.extension.v1.s3.UploadPartCopyOutput - 41, // 76: spec.proto.extension.v1.s3.ObjectStorageService.CompleteMultipartUpload:output_type -> spec.proto.extension.v1.s3.CompleteMultipartUploadOutput - 43, // 77: spec.proto.extension.v1.s3.ObjectStorageService.AbortMultipartUpload:output_type -> spec.proto.extension.v1.s3.AbortMultipartUploadOutput - 47, // 78: spec.proto.extension.v1.s3.ObjectStorageService.ListMultipartUploads:output_type -> spec.proto.extension.v1.s3.ListMultipartUploadsOutput - 63, // 79: spec.proto.extension.v1.s3.ObjectStorageService.ListParts:output_type -> spec.proto.extension.v1.s3.ListPartsOutput - 51, // 80: spec.proto.extension.v1.s3.ObjectStorageService.ListObjectVersions:output_type -> spec.proto.extension.v1.s3.ListObjectVersionsOutput - 57, // 81: spec.proto.extension.v1.s3.ObjectStorageService.SignURL:output_type -> spec.proto.extension.v1.s3.SignURLOutput - 78, // 82: spec.proto.extension.v1.s3.ObjectStorageService.UpdateDownloadBandwidthRateLimit:output_type -> google.protobuf.Empty - 78, // 83: spec.proto.extension.v1.s3.ObjectStorageService.UpdateUploadBandwidthRateLimit:output_type -> google.protobuf.Empty - 60, // 84: spec.proto.extension.v1.s3.ObjectStorageService.AppendObject:output_type -> spec.proto.extension.v1.s3.AppendObjectOutput - 30, // 85: spec.proto.extension.v1.s3.ObjectStorageService.RestoreObject:output_type -> spec.proto.extension.v1.s3.RestoreObjectOutput - 60, // [60:86] is the sub-list for method output_type - 34, // [34:60] is the sub-list for method input_type - 34, // [34:34] is the sub-list for extension type_name - 34, // [34:34] is the sub-list for extension extendee - 0, // [0:34] is the sub-list for field type_name + 31, // 18: spec.proto.extension.v1.s3.InputSerialization.csv:type_name -> spec.proto.extension.v1.s3.CSVInput + 33, // 19: spec.proto.extension.v1.s3.OutputSerialization.csv:type_name -> spec.proto.extension.v1.s3.CSVOutput + 32, // 20: spec.proto.extension.v1.s3.SelectParameters.input_serialization:type_name -> spec.proto.extension.v1.s3.InputSerialization + 34, // 21: spec.proto.extension.v1.s3.SelectParameters.output_serialization:type_name -> spec.proto.extension.v1.s3.OutputSerialization + 29, // 22: spec.proto.extension.v1.s3.RestoreRequest.glacier_job_parameters:type_name -> spec.proto.extension.v1.s3.GlacierJobParameters + 30, // 23: spec.proto.extension.v1.s3.RestoreRequest.output_location:type_name -> spec.proto.extension.v1.s3.OutputLocation + 35, // 24: spec.proto.extension.v1.s3.RestoreRequest.select_parameters:type_name -> spec.proto.extension.v1.s3.SelectParameters + 36, // 25: spec.proto.extension.v1.s3.RestoreObjectInput.restore_request:type_name -> spec.proto.extension.v1.s3.RestoreRequest + 82, // 26: spec.proto.extension.v1.s3.CreateMultipartUploadInput.meta_data:type_name -> spec.proto.extension.v1.s3.CreateMultipartUploadInput.MetaDataEntry + 83, // 27: spec.proto.extension.v1.s3.CreateMultipartUploadInput.tagging:type_name -> spec.proto.extension.v1.s3.CreateMultipartUploadInput.TaggingEntry + 12, // 28: spec.proto.extension.v1.s3.UploadPartCopyInput.copy_source:type_name -> spec.proto.extension.v1.s3.CopySource + 44, // 29: spec.proto.extension.v1.s3.UploadPartCopyOutput.copy_part_result:type_name -> spec.proto.extension.v1.s3.CopyPartResult + 46, // 30: spec.proto.extension.v1.s3.CompletedMultipartUpload.parts:type_name -> spec.proto.extension.v1.s3.CompletedPart + 47, // 31: spec.proto.extension.v1.s3.CompleteMultipartUploadInput.multipart_upload:type_name -> spec.proto.extension.v1.s3.CompletedMultipartUpload + 53, // 32: spec.proto.extension.v1.s3.MultipartUpload.initiator:type_name -> spec.proto.extension.v1.s3.Initiator + 23, // 33: spec.proto.extension.v1.s3.MultipartUpload.owner:type_name -> spec.proto.extension.v1.s3.Owner + 54, // 34: spec.proto.extension.v1.s3.ListMultipartUploadsOutput.uploads:type_name -> spec.proto.extension.v1.s3.MultipartUpload + 23, // 35: spec.proto.extension.v1.s3.DeleteMarkerEntry.owner:type_name -> spec.proto.extension.v1.s3.Owner + 23, // 36: spec.proto.extension.v1.s3.ObjectVersion.owner:type_name -> spec.proto.extension.v1.s3.Owner + 57, // 37: spec.proto.extension.v1.s3.ListObjectVersionsOutput.delete_markers:type_name -> spec.proto.extension.v1.s3.DeleteMarkerEntry + 58, // 38: spec.proto.extension.v1.s3.ListObjectVersionsOutput.versions:type_name -> spec.proto.extension.v1.s3.ObjectVersion + 84, // 39: spec.proto.extension.v1.s3.HeadObjectOutput.result_metadata:type_name -> spec.proto.extension.v1.s3.HeadObjectOutput.ResultMetadataEntry + 85, // 40: spec.proto.extension.v1.s3.AppendObjectInput.tags:type_name -> spec.proto.extension.v1.s3.AppendObjectInput.TagsEntry + 70, // 41: spec.proto.extension.v1.s3.ListPartsOutput.parts:type_name -> spec.proto.extension.v1.s3.Part + 2, // 42: spec.proto.extension.v1.s3.ObjectStorageService.PutObject:input_type -> spec.proto.extension.v1.s3.PutObjectInput + 0, // 43: spec.proto.extension.v1.s3.ObjectStorageService.GetObject:input_type -> spec.proto.extension.v1.s3.GetObjectInput + 4, // 44: spec.proto.extension.v1.s3.ObjectStorageService.DeleteObject:input_type -> spec.proto.extension.v1.s3.DeleteObjectInput + 13, // 45: spec.proto.extension.v1.s3.ObjectStorageService.CopyObject:input_type -> spec.proto.extension.v1.s3.CopyObjectInput + 18, // 46: spec.proto.extension.v1.s3.ObjectStorageService.DeleteObjects:input_type -> spec.proto.extension.v1.s3.DeleteObjectsInput + 21, // 47: spec.proto.extension.v1.s3.ObjectStorageService.ListObjects:input_type -> spec.proto.extension.v1.s3.ListObjectsInput + 60, // 48: spec.proto.extension.v1.s3.ObjectStorageService.HeadObject:input_type -> spec.proto.extension.v1.s3.HeadObjectInput + 62, // 49: spec.proto.extension.v1.s3.ObjectStorageService.IsObjectExist:input_type -> spec.proto.extension.v1.s3.IsObjectExistInput + 6, // 50: spec.proto.extension.v1.s3.ObjectStorageService.PutObjectTagging:input_type -> spec.proto.extension.v1.s3.PutObjectTaggingInput + 8, // 51: spec.proto.extension.v1.s3.ObjectStorageService.DeleteObjectTagging:input_type -> spec.proto.extension.v1.s3.DeleteObjectTaggingInput + 10, // 52: spec.proto.extension.v1.s3.ObjectStorageService.GetObjectTagging:input_type -> spec.proto.extension.v1.s3.GetObjectTaggingInput + 25, // 53: spec.proto.extension.v1.s3.ObjectStorageService.GetObjectCannedAcl:input_type -> spec.proto.extension.v1.s3.GetObjectCannedAclInput + 27, // 54: spec.proto.extension.v1.s3.ObjectStorageService.PutObjectCannedAcl:input_type -> spec.proto.extension.v1.s3.PutObjectCannedAclInput + 39, // 55: spec.proto.extension.v1.s3.ObjectStorageService.CreateMultipartUpload:input_type -> spec.proto.extension.v1.s3.CreateMultipartUploadInput + 41, // 56: spec.proto.extension.v1.s3.ObjectStorageService.UploadPart:input_type -> spec.proto.extension.v1.s3.UploadPartInput + 43, // 57: spec.proto.extension.v1.s3.ObjectStorageService.UploadPartCopy:input_type -> spec.proto.extension.v1.s3.UploadPartCopyInput + 48, // 58: spec.proto.extension.v1.s3.ObjectStorageService.CompleteMultipartUpload:input_type -> spec.proto.extension.v1.s3.CompleteMultipartUploadInput + 50, // 59: spec.proto.extension.v1.s3.ObjectStorageService.AbortMultipartUpload:input_type -> spec.proto.extension.v1.s3.AbortMultipartUploadInput + 52, // 60: spec.proto.extension.v1.s3.ObjectStorageService.ListMultipartUploads:input_type -> spec.proto.extension.v1.s3.ListMultipartUploadsInput + 69, // 61: spec.proto.extension.v1.s3.ObjectStorageService.ListParts:input_type -> spec.proto.extension.v1.s3.ListPartsInput + 56, // 62: spec.proto.extension.v1.s3.ObjectStorageService.ListObjectVersions:input_type -> spec.proto.extension.v1.s3.ListObjectVersionsInput + 64, // 63: spec.proto.extension.v1.s3.ObjectStorageService.SignURL:input_type -> spec.proto.extension.v1.s3.SignURLInput + 66, // 64: spec.proto.extension.v1.s3.ObjectStorageService.UpdateDownloadBandwidthRateLimit:input_type -> spec.proto.extension.v1.s3.UpdateBandwidthRateLimitInput + 66, // 65: spec.proto.extension.v1.s3.ObjectStorageService.UpdateUploadBandwidthRateLimit:input_type -> spec.proto.extension.v1.s3.UpdateBandwidthRateLimitInput + 67, // 66: spec.proto.extension.v1.s3.ObjectStorageService.AppendObject:input_type -> spec.proto.extension.v1.s3.AppendObjectInput + 37, // 67: spec.proto.extension.v1.s3.ObjectStorageService.RestoreObject:input_type -> spec.proto.extension.v1.s3.RestoreObjectInput + 3, // 68: spec.proto.extension.v1.s3.ObjectStorageService.PutObject:output_type -> spec.proto.extension.v1.s3.PutObjectOutput + 1, // 69: spec.proto.extension.v1.s3.ObjectStorageService.GetObject:output_type -> spec.proto.extension.v1.s3.GetObjectOutput + 5, // 70: spec.proto.extension.v1.s3.ObjectStorageService.DeleteObject:output_type -> spec.proto.extension.v1.s3.DeleteObjectOutput + 15, // 71: spec.proto.extension.v1.s3.ObjectStorageService.CopyObject:output_type -> spec.proto.extension.v1.s3.CopyObjectOutput + 20, // 72: spec.proto.extension.v1.s3.ObjectStorageService.DeleteObjects:output_type -> spec.proto.extension.v1.s3.DeleteObjectsOutput + 22, // 73: spec.proto.extension.v1.s3.ObjectStorageService.ListObjects:output_type -> spec.proto.extension.v1.s3.ListObjectsOutput + 61, // 74: spec.proto.extension.v1.s3.ObjectStorageService.HeadObject:output_type -> spec.proto.extension.v1.s3.HeadObjectOutput + 63, // 75: spec.proto.extension.v1.s3.ObjectStorageService.IsObjectExist:output_type -> spec.proto.extension.v1.s3.IsObjectExistOutput + 7, // 76: spec.proto.extension.v1.s3.ObjectStorageService.PutObjectTagging:output_type -> spec.proto.extension.v1.s3.PutObjectTaggingOutput + 9, // 77: spec.proto.extension.v1.s3.ObjectStorageService.DeleteObjectTagging:output_type -> spec.proto.extension.v1.s3.DeleteObjectTaggingOutput + 11, // 78: spec.proto.extension.v1.s3.ObjectStorageService.GetObjectTagging:output_type -> spec.proto.extension.v1.s3.GetObjectTaggingOutput + 26, // 79: spec.proto.extension.v1.s3.ObjectStorageService.GetObjectCannedAcl:output_type -> spec.proto.extension.v1.s3.GetObjectCannedAclOutput + 28, // 80: spec.proto.extension.v1.s3.ObjectStorageService.PutObjectCannedAcl:output_type -> spec.proto.extension.v1.s3.PutObjectCannedAclOutput + 40, // 81: spec.proto.extension.v1.s3.ObjectStorageService.CreateMultipartUpload:output_type -> spec.proto.extension.v1.s3.CreateMultipartUploadOutput + 42, // 82: spec.proto.extension.v1.s3.ObjectStorageService.UploadPart:output_type -> spec.proto.extension.v1.s3.UploadPartOutput + 45, // 83: spec.proto.extension.v1.s3.ObjectStorageService.UploadPartCopy:output_type -> spec.proto.extension.v1.s3.UploadPartCopyOutput + 49, // 84: spec.proto.extension.v1.s3.ObjectStorageService.CompleteMultipartUpload:output_type -> spec.proto.extension.v1.s3.CompleteMultipartUploadOutput + 51, // 85: spec.proto.extension.v1.s3.ObjectStorageService.AbortMultipartUpload:output_type -> spec.proto.extension.v1.s3.AbortMultipartUploadOutput + 55, // 86: spec.proto.extension.v1.s3.ObjectStorageService.ListMultipartUploads:output_type -> spec.proto.extension.v1.s3.ListMultipartUploadsOutput + 71, // 87: spec.proto.extension.v1.s3.ObjectStorageService.ListParts:output_type -> spec.proto.extension.v1.s3.ListPartsOutput + 59, // 88: spec.proto.extension.v1.s3.ObjectStorageService.ListObjectVersions:output_type -> spec.proto.extension.v1.s3.ListObjectVersionsOutput + 65, // 89: spec.proto.extension.v1.s3.ObjectStorageService.SignURL:output_type -> spec.proto.extension.v1.s3.SignURLOutput + 86, // 90: spec.proto.extension.v1.s3.ObjectStorageService.UpdateDownloadBandwidthRateLimit:output_type -> google.protobuf.Empty + 86, // 91: spec.proto.extension.v1.s3.ObjectStorageService.UpdateUploadBandwidthRateLimit:output_type -> google.protobuf.Empty + 68, // 92: spec.proto.extension.v1.s3.ObjectStorageService.AppendObject:output_type -> spec.proto.extension.v1.s3.AppendObjectOutput + 38, // 93: spec.proto.extension.v1.s3.ObjectStorageService.RestoreObject:output_type -> spec.proto.extension.v1.s3.RestoreObjectOutput + 68, // [68:94] is the sub-list for method output_type + 42, // [42:68] is the sub-list for method input_type + 42, // [42:42] is the sub-list for extension type_name + 42, // [42:42] is the sub-list for extension extendee + 0, // [0:42] is the sub-list for field type_name } func init() { file_oss_proto_init() } @@ -8325,7 +9106,7 @@ func file_oss_proto_init() { } } file_oss_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RestoreObjectInput); i { + switch v := v.(*GlacierJobParameters); i { case 0: return &v.state case 1: @@ -8337,7 +9118,7 @@ func file_oss_proto_init() { } } file_oss_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RestoreObjectOutput); i { + switch v := v.(*OutputLocation); i { case 0: return &v.state case 1: @@ -8349,7 +9130,7 @@ func file_oss_proto_init() { } } file_oss_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateMultipartUploadInput); i { + switch v := v.(*CSVInput); i { case 0: return &v.state case 1: @@ -8361,7 +9142,7 @@ func file_oss_proto_init() { } } file_oss_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateMultipartUploadOutput); i { + switch v := v.(*InputSerialization); i { case 0: return &v.state case 1: @@ -8373,7 +9154,7 @@ func file_oss_proto_init() { } } file_oss_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UploadPartInput); i { + switch v := v.(*CSVOutput); i { case 0: return &v.state case 1: @@ -8385,7 +9166,7 @@ func file_oss_proto_init() { } } file_oss_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UploadPartOutput); i { + switch v := v.(*OutputSerialization); i { case 0: return &v.state case 1: @@ -8397,7 +9178,7 @@ func file_oss_proto_init() { } } file_oss_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UploadPartCopyInput); i { + switch v := v.(*SelectParameters); i { case 0: return &v.state case 1: @@ -8409,7 +9190,7 @@ func file_oss_proto_init() { } } file_oss_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CopyPartResult); i { + switch v := v.(*RestoreRequest); i { case 0: return &v.state case 1: @@ -8421,7 +9202,7 @@ func file_oss_proto_init() { } } file_oss_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UploadPartCopyOutput); i { + switch v := v.(*RestoreObjectInput); i { case 0: return &v.state case 1: @@ -8433,7 +9214,7 @@ func file_oss_proto_init() { } } file_oss_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CompletedPart); i { + switch v := v.(*RestoreObjectOutput); i { case 0: return &v.state case 1: @@ -8445,7 +9226,7 @@ func file_oss_proto_init() { } } file_oss_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CompletedMultipartUpload); i { + switch v := v.(*CreateMultipartUploadInput); i { case 0: return &v.state case 1: @@ -8457,7 +9238,7 @@ func file_oss_proto_init() { } } file_oss_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CompleteMultipartUploadInput); i { + switch v := v.(*CreateMultipartUploadOutput); i { case 0: return &v.state case 1: @@ -8469,7 +9250,7 @@ func file_oss_proto_init() { } } file_oss_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CompleteMultipartUploadOutput); i { + switch v := v.(*UploadPartInput); i { case 0: return &v.state case 1: @@ -8481,7 +9262,7 @@ func file_oss_proto_init() { } } file_oss_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AbortMultipartUploadInput); i { + switch v := v.(*UploadPartOutput); i { case 0: return &v.state case 1: @@ -8493,7 +9274,7 @@ func file_oss_proto_init() { } } file_oss_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AbortMultipartUploadOutput); i { + switch v := v.(*UploadPartCopyInput); i { case 0: return &v.state case 1: @@ -8505,7 +9286,7 @@ func file_oss_proto_init() { } } file_oss_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListMultipartUploadsInput); i { + switch v := v.(*CopyPartResult); i { case 0: return &v.state case 1: @@ -8517,7 +9298,7 @@ func file_oss_proto_init() { } } file_oss_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Initiator); i { + switch v := v.(*UploadPartCopyOutput); i { case 0: return &v.state case 1: @@ -8529,7 +9310,7 @@ func file_oss_proto_init() { } } file_oss_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MultipartUpload); i { + switch v := v.(*CompletedPart); i { case 0: return &v.state case 1: @@ -8541,7 +9322,7 @@ func file_oss_proto_init() { } } file_oss_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListMultipartUploadsOutput); i { + switch v := v.(*CompletedMultipartUpload); i { case 0: return &v.state case 1: @@ -8553,7 +9334,7 @@ func file_oss_proto_init() { } } file_oss_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListObjectVersionsInput); i { + switch v := v.(*CompleteMultipartUploadInput); i { case 0: return &v.state case 1: @@ -8565,7 +9346,7 @@ func file_oss_proto_init() { } } file_oss_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteMarkerEntry); i { + switch v := v.(*CompleteMultipartUploadOutput); i { case 0: return &v.state case 1: @@ -8577,7 +9358,7 @@ func file_oss_proto_init() { } } file_oss_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ObjectVersion); i { + switch v := v.(*AbortMultipartUploadInput); i { case 0: return &v.state case 1: @@ -8589,7 +9370,7 @@ func file_oss_proto_init() { } } file_oss_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListObjectVersionsOutput); i { + switch v := v.(*AbortMultipartUploadOutput); i { case 0: return &v.state case 1: @@ -8601,7 +9382,7 @@ func file_oss_proto_init() { } } file_oss_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HeadObjectInput); i { + switch v := v.(*ListMultipartUploadsInput); i { case 0: return &v.state case 1: @@ -8613,7 +9394,7 @@ func file_oss_proto_init() { } } file_oss_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HeadObjectOutput); i { + switch v := v.(*Initiator); i { case 0: return &v.state case 1: @@ -8625,7 +9406,7 @@ func file_oss_proto_init() { } } file_oss_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*IsObjectExistInput); i { + switch v := v.(*MultipartUpload); i { case 0: return &v.state case 1: @@ -8637,7 +9418,7 @@ func file_oss_proto_init() { } } file_oss_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*IsObjectExistOutput); i { + switch v := v.(*ListMultipartUploadsOutput); i { case 0: return &v.state case 1: @@ -8649,7 +9430,7 @@ func file_oss_proto_init() { } } file_oss_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SignURLInput); i { + switch v := v.(*ListObjectVersionsInput); i { case 0: return &v.state case 1: @@ -8661,7 +9442,7 @@ func file_oss_proto_init() { } } file_oss_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SignURLOutput); i { + switch v := v.(*DeleteMarkerEntry); i { case 0: return &v.state case 1: @@ -8673,7 +9454,7 @@ func file_oss_proto_init() { } } file_oss_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateBandwidthRateLimitInput); i { + switch v := v.(*ObjectVersion); i { case 0: return &v.state case 1: @@ -8685,7 +9466,7 @@ func file_oss_proto_init() { } } file_oss_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AppendObjectInput); i { + switch v := v.(*ListObjectVersionsOutput); i { case 0: return &v.state case 1: @@ -8697,7 +9478,7 @@ func file_oss_proto_init() { } } file_oss_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AppendObjectOutput); i { + switch v := v.(*HeadObjectInput); i { case 0: return &v.state case 1: @@ -8709,7 +9490,7 @@ func file_oss_proto_init() { } } file_oss_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListPartsInput); i { + switch v := v.(*HeadObjectOutput); i { case 0: return &v.state case 1: @@ -8721,7 +9502,7 @@ func file_oss_proto_init() { } } file_oss_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Part); i { + switch v := v.(*IsObjectExistInput); i { case 0: return &v.state case 1: @@ -8733,6 +9514,102 @@ func file_oss_proto_init() { } } file_oss_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*IsObjectExistOutput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_oss_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SignURLInput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_oss_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SignURLOutput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_oss_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateBandwidthRateLimitInput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_oss_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AppendObjectInput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_oss_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AppendObjectOutput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_oss_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListPartsInput); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_oss_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Part); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_oss_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListPartsOutput); i { case 0: return &v.state @@ -8751,7 +9628,7 @@ func file_oss_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_oss_proto_rawDesc, NumEnums: 0, - NumMessages: 78, + NumMessages: 86, NumExtensions: 0, NumServices: 1, }, diff --git a/spec/proto/extension/v1/s3/oss.proto b/spec/proto/extension/v1/s3/oss.proto index 9d46e2113a..aa630e2f99 100644 --- a/spec/proto/extension/v1/s3/oss.proto +++ b/spec/proto/extension/v1/s3/oss.proto @@ -265,6 +265,8 @@ message PutObjectInput{ map meta = 13; // The tag-set for the object. The tag-set must be encoded as URL Query parameters. map tagging = 14; + // Storage class options. + string storage_class = 15; } // PutObjectOutput @@ -634,6 +636,140 @@ message PutObjectCannedAclOutput{ string request_charged = 1; } +// GlacierJobParameters +message GlacierJobParameters{ + // Retrieval tier at which the restore will be processed. + // This member is required. + string tier = 1; +} + +// OutPutLocation +message OutputLocation{ + // The name of the bucket where the restore results will be placed. + // This member is required. + string bucket_name = 1; + // The prefix that is prepended to the restore results for this request. + // This member is required. + string prefix = 2; +} + +// CSVInput +message CSVInput{ + // Specifies that CSV field values may contain quoted record delimiters and such + // records should be allowed. Default value is FALSE. Setting this value to TRUE + // may lower performance. + bool allow_quoted_record_delimiter = 1; + // A single character used to indicate that a row should be ignored when the + // character is present at the start of that row. You can specify any character to + // indicate a comment line. + string comments = 2; + // A single character used to separate individual fields in a record. You can + // specify an arbitrary delimiter. + string field_delimiter = 3; + // Describes the first line of input. Valid values are: + // + // * NONE: First line is not + // a header. + // + // * IGNORE: First line is a header, but you can't use the header values + // to indicate the column in an expression. You can use column position (such as + // _1, _2, …) to indicate the column (SELECT s._1 FROM OBJECT s). + // + // * Use: First + // line is a header, and you can use the header value to identify a column in an + // expression (SELECT "name" FROM OBJECT). + string file_header_info = 4; + // A single character used for escaping when the field delimiter is part of the + // value. For example, if the value is a, b, Amazon S3 wraps this field value in + // quotation marks, as follows: " a , b ". Type: String Default: " Ancestors: CSV + string quote_character = 5; + // A single character used for escaping the quotation mark character inside an + // already escaped value. For example, the value """ a , b """ is parsed as " a , b + // ". + string quote_escape_character = 6; + // A single character used to separate individual records in the input. Instead of + // the default value, you can specify an arbitrary delimiter. + string record_delimiter = 7; +} + +// InputSerialization +message InputSerialization{ + // Describes the serialization of a CSV-encoded object. + CSVInput csv = 1; + // Specifies object's compression format. Valid values: NONE, GZIP, BZIP2. Default + // Value: NONE. + string compression_type = 2; + // Specifies JSON as object's input serialization format. + string json = 3; +} + +// CSVOutput +message CSVOutput{ + // The value used to separate individual fields in a record. You can specify an + // arbitrary delimiter. + string field_delimiter = 1; + // A single character used for escaping when the field delimiter is part of the + // value. For example, if the value is a, b, Amazon S3 wraps this field value in + // quotation marks, as follows: " a , b ". + string quote_character = 2; + // The single character used for escaping the quote character inside an already + // escaped value. + string quote_escape_character = 3; + // Indicates whether to use quotation marks around output fields. + // + // * ALWAYS: Always + // use quotation marks for output fields. + // + // * ASNEEDED: Use quotation marks for + // output fields when needed. + string quote_fields = 4; + // A single character used to separate individual records in the output. Instead of + // the default value, you can specify an arbitrary delimiter. + string record_delimiter = 5; +} + +// OutputSerialization +message OutputSerialization{ + // Describes the serialization of CSV-encoded Select results. + CSVOutput csv = 1; + // Specifies JSON as request's output serialization format. + string json = 2; +} + +// SelectParameters +message SelectParameters{ + // The expression that is used to query the object. + // This member is required. + string expression = 1; + // The type of the provided expression (for example, SQL). + // This member is required. + string expression_type = 2; + // Describes the serialization format of the object. + // This member is required. + InputSerialization input_serialization = 3; + // Describes how the results of the Select job are serialized. + // This member is required. + OutputSerialization output_serialization = 4; +} + +// RestoreRequest +message RestoreRequest{ + // Lifetime of the active copy in days. + int32 days = 1; + // The optional description for the job. + string description = 2; + // S3 Glacier related parameters pertaining to this job. + GlacierJobParameters glacier_job_parameters = 3; + // Describes the location where the restore job's output is stored. + OutputLocation output_location = 4; + // Describes the parameters for Select job types. + SelectParameters select_parameters = 5; + // Retrieval tier at which the restore will be processed. + string tier = 6; + // Type of restore request. + string type = 7; +} + // RestoreObjectInput message RestoreObjectInput{ // Required. The name of oss store. @@ -644,6 +780,8 @@ message RestoreObjectInput{ // Name of the object key. // This member is required. string key = 3; + // The information of restoring request. + RestoreRequest restore_request = 4; // VersionId used to reference a specific version of the object. string version_id = 5; } diff --git a/spec/proto/runtime/v1/appcallback.pb.go b/spec/proto/runtime/v1/appcallback.pb.go index 0575000e72..9e6f1cc462 100644 --- a/spec/proto/runtime/v1/appcallback.pb.go +++ b/spec/proto/runtime/v1/appcallback.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.0 +// protoc-gen-go v1.28.1 // protoc v3.17.3 // source: appcallback.proto diff --git a/spec/proto/runtime/v1/runtime.pb.go b/spec/proto/runtime/v1/runtime.pb.go index 60480c17ae..713c22f4fc 100644 --- a/spec/proto/runtime/v1/runtime.pb.go +++ b/spec/proto/runtime/v1/runtime.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.0 +// protoc-gen-go v1.28.1 // protoc v3.17.3 // source: runtime.proto From 228b28112e5c7408d925aeac04800ad3f6786d01 Mon Sep 17 00:00:00 2001 From: wlwilliamx Date: Tue, 30 Aug 2022 14:42:12 +0800 Subject: [PATCH 02/19] chore(ceph oss test): update ceph oss test --- components/oss/ceph/oss_test.go | 412 +------------------------------- 1 file changed, 4 insertions(+), 408 deletions(-) diff --git a/components/oss/ceph/oss_test.go b/components/oss/ceph/oss_test.go index e660785836..448e2e2dc5 100644 --- a/components/oss/ceph/oss_test.go +++ b/components/oss/ceph/oss_test.go @@ -17,20 +17,12 @@ package ceph import ( - "bytes" "context" "encoding/json" "errors" - "fmt" - "io" - "io/ioutil" - "log" - "os" - "testing" - "time" - "github.com/stretchr/testify/assert" "mosn.io/pkg/buffer" + "testing" "mosn.io/layotto/components/oss" ) @@ -38,9 +30,9 @@ import ( const ( confWithoutUidAndBucket = ` { - "endpoint": "http://10.211.55.13:7480", - "accessKeyID": "QRF1XGIPZ9TB094ETTWU", - "accessKeySecret": "6gF61QLVduFIFDKPBzc6gKkOsQY2HpAt7vM5mRAA" + "endpoint": "endpoint_address", + "accessKeyID": "accessKey", + "accessKeySecret": "secret" } ` ) @@ -52,402 +44,6 @@ func TestCephDefaultInitFunc(t *testing.T) { assert.Nil(t, a.client) } -func TestCephOss_GetObject(t *testing.T) { - cephOss := NewCephOss() - err := cephOss.Init(context.TODO(), &oss.Config{Metadata: map[string]json.RawMessage{oss.BasicConfiguration: []byte(confWithoutUidAndBucket)}}) - assert.Nil(t, err) - - req := &oss.GetObjectInput{ - Bucket: "test.bucket", - Key: "TestPut.txt", - } - out, err := cephOss.GetObject(context.Background(), req) - assert.Nil(t, err) - - data, err := ioutil.ReadAll(out.DataStream) - assert.Nil(t, err) - fmt.Println(string(data)) -} - -func TestCephOss_PutObject(t *testing.T) { - cephOss := NewCephOss() - err := cephOss.Init(context.TODO(), &oss.Config{Metadata: map[string]json.RawMessage{oss.BasicConfiguration: []byte(confWithoutUidAndBucket)}}) - assert.Nil(t, err) - - reader, err := os.Open("/Users/apple/Desktop/untitled 3.txt") - assert.Nil(t, err) - req := &oss.PutObjectInput{ - DataStream: reader, - Bucket: "test.bucket", - Key: "TestPut.txt", - } - - out, err := cephOss.PutObject(context.Background(), req) - assert.Nil(t, err) - printOutput(out) -} - -func TestCephOss_DeleteObject(t *testing.T) { - cephOss := NewCephOss() - err := cephOss.Init(context.TODO(), &oss.Config{Metadata: map[string]json.RawMessage{oss.BasicConfiguration: []byte(confWithoutUidAndBucket)}}) - assert.Nil(t, err) - - req := &oss.DeleteObjectInput{ - Bucket: "test.bucket", - Key: "TestPut.txt", - } - - out, err := cephOss.DeleteObject(context.Background(), req) - assert.Nil(t, err) - printOutput(out) -} - -func TestCephOss_DeleteObjects(t *testing.T) { - cephOss := NewCephOss() - err := cephOss.Init(context.TODO(), &oss.Config{Metadata: map[string]json.RawMessage{oss.BasicConfiguration: []byte(confWithoutUidAndBucket)}}) - assert.Nil(t, err) - - d := &oss.Delete{ - Objects: []*oss.ObjectIdentifier{ - {Key: "TestPut.txt"}, - {Key: "a.txt"}, - }, - } - req := &oss.DeleteObjectsInput{ - Bucket: "test.bucket", - Delete: d, - } - out, err := cephOss.DeleteObjects(context.Background(), req) - assert.Nil(t, err) - printOutput(out) -} - -func TestCephOss_ListObjects(t *testing.T) { - cephOss := NewCephOss() - err := cephOss.Init(context.TODO(), &oss.Config{Metadata: map[string]json.RawMessage{oss.BasicConfiguration: []byte(confWithoutUidAndBucket)}}) - assert.Nil(t, err) - - req := &oss.ListObjectsInput{ - Bucket: "test.bucket", - } - - out, err := cephOss.ListObjects(context.Background(), req) - assert.Nil(t, err) - printOutput(out) -} - -func TestCephOss_PutObjectTagging(t *testing.T) { - cephOss := NewCephOss() - err := cephOss.Init(context.TODO(), &oss.Config{Metadata: map[string]json.RawMessage{oss.BasicConfiguration: []byte(confWithoutUidAndBucket)}}) - assert.Nil(t, err) - - tags := map[string]string{ - "Test": "True", - "HAHA": "haha", - } - req := &oss.PutObjectTaggingInput{ - Bucket: "test.bucket", - Key: "TestPut.txt", - Tags: tags, - } - - out, err := cephOss.PutObjectTagging(context.Background(), req) - assert.Nil(t, err) - printOutput(out) -} - -func TestCephOss_GetObjectTagging(t *testing.T) { - cephOss := NewCephOss() - err := cephOss.Init(context.TODO(), &oss.Config{Metadata: map[string]json.RawMessage{oss.BasicConfiguration: []byte(confWithoutUidAndBucket)}}) - assert.Nil(t, err) - - req := &oss.GetObjectTaggingInput{ - Bucket: "test.bucket", - Key: "TestPut.txt", - } - - out, err := cephOss.GetObjectTagging(context.Background(), req) - assert.Nil(t, err) - printOutput(out) -} - -func TestCephOss_DeleteObjectTagging(t *testing.T) { - cephOss := NewCephOss() - err := cephOss.Init(context.TODO(), &oss.Config{Metadata: map[string]json.RawMessage{oss.BasicConfiguration: []byte(confWithoutUidAndBucket)}}) - assert.Nil(t, err) - - req := &oss.DeleteObjectTaggingInput{ - Bucket: "test.bucket", - Key: "TestPut.txt", - } - - out, err := cephOss.DeleteObjectTagging(context.Background(), req) - assert.Nil(t, err) - printOutput(out) -} - -func TestCephOss_CopyObject(t *testing.T) { - cephOss := NewCephOss() - err := cephOss.Init(context.TODO(), &oss.Config{Metadata: map[string]json.RawMessage{oss.BasicConfiguration: []byte(confWithoutUidAndBucket)}}) - assert.Nil(t, err) - - source := oss.CopySource{ - CopySourceBucket: "test.bucket", - CopySourceKey: "haha.txt", - } - req := &oss.CopyObjectInput{ - Bucket: "test.bucket", - Key: "b.txt", - CopySource: &source, - } - - out, err := cephOss.CopyObject(context.Background(), req) - assert.Nil(t, err) - printOutput(out) -} - -func TestCephOss_PutObjectCannedAcl(t *testing.T) { - cephOss := NewCephOss() - err := cephOss.Init(context.TODO(), &oss.Config{Metadata: map[string]json.RawMessage{oss.BasicConfiguration: []byte(confWithoutUidAndBucket)}}) - assert.Nil(t, err) - - req := &oss.PutObjectCannedAclInput{ - Bucket: "test.bucket", - Key: "TestPut.txt", - Acl: "private", - } - - out, err := cephOss.PutObjectCannedAcl(context.Background(), req) - assert.Nil(t, err) - printOutput(out) -} - -func TestCephOss_GetObjectCannedAcl(t *testing.T) { - cephOss := NewCephOss() - err := cephOss.Init(context.TODO(), &oss.Config{Metadata: map[string]json.RawMessage{oss.BasicConfiguration: []byte(confWithoutUidAndBucket)}}) - assert.Nil(t, err) - - req := &oss.GetObjectCannedAclInput{ - Bucket: "test.bucket", - Key: "TestPut.txt", - } - - out, err := cephOss.GetObjectCannedAcl(context.Background(), req) - assert.Nil(t, err) - fmt.Printf("%+v\n", out) -} - -func TestCephOss_MultipartUploadWithAbort(t *testing.T) { - cephOss := NewCephOss() - err := cephOss.Init(context.TODO(), &oss.Config{Metadata: map[string]json.RawMessage{oss.BasicConfiguration: []byte(confWithoutUidAndBucket)}}) - assert.Nil(t, err) - - key := "TestMultipartUploadWithAbort" - uploadId := createMultipartUpload(t, cephOss, key) - - f, err := os.Open("/Users/apple/Downloads/TestMultipartUpload.zip") - assert.Nil(t, err) - uploadPart(t, cephOss, key, uploadId, 1, f) - - abortMultipartUpload(t, cephOss, key, uploadId) -} - -func TestCephOss_MultipartUploadWithComplete(t *testing.T) { - cephOss := NewCephOss() - err := cephOss.Init(context.TODO(), &oss.Config{Metadata: map[string]json.RawMessage{oss.BasicConfiguration: []byte(confWithoutUidAndBucket)}}) - assert.Nil(t, err) - - key := "TestMultipartUploadWithComplete" - uploadId := createMultipartUpload(t, cephOss, key) - f, err := os.Open("/Users/apple/Downloads/TestMultipartUpload.zip") - assert.Nil(t, err) - go listMultipartUploads(t, cephOss) - eTag := uploadPart(t, cephOss, key, uploadId, 1, f) - listParts(t, cephOss, key, uploadId) - - completeMultipartUpload(t, cephOss, key, uploadId, eTag, 1) -} - -func TestCephOss_UploadPartCopy(t *testing.T) { - cephOss := NewCephOss() - err := cephOss.Init(context.TODO(), &oss.Config{Metadata: map[string]json.RawMessage{oss.BasicConfiguration: []byte(confWithoutUidAndBucket)}}) - assert.Nil(t, err) - - key := "TestUploadPartCopy" - uploadId := createMultipartUpload(t, cephOss, key) - assert.Nil(t, err) - eTag := uploadPartCopy(t, cephOss, uploadId, 1) - - completeMultipartUpload(t, cephOss, key, uploadId, eTag, 1) -} - -func TestCephOss_ListObjectVersions(t *testing.T) { - cephOss := NewCephOss() - err := cephOss.Init(context.TODO(), &oss.Config{Metadata: map[string]json.RawMessage{oss.BasicConfiguration: []byte(confWithoutUidAndBucket)}}) - assert.Nil(t, err) - - req := &oss.ListObjectVersionsInput{ - Bucket: "test.bucket", - } - - out, err := cephOss.ListObjectVersions(context.Background(), req) - assert.Nil(t, err) - printOutput(out) -} - -func TestCephOss_HeadObject(t *testing.T) { - cephOss := NewCephOss() - err := cephOss.Init(context.TODO(), &oss.Config{Metadata: map[string]json.RawMessage{oss.BasicConfiguration: []byte(confWithoutUidAndBucket)}}) - assert.Nil(t, err) - - req := &oss.HeadObjectInput{ - Bucket: "test.bucket", - Key: "TestPut.txt", - } - - out, err := cephOss.HeadObject(context.Background(), req) - assert.Nil(t, err) - printOutput(out) -} - -func TestCephOss_IsObjectExist(t *testing.T) { - cephOss := NewCephOss() - err := cephOss.Init(context.TODO(), &oss.Config{Metadata: map[string]json.RawMessage{oss.BasicConfiguration: []byte(confWithoutUidAndBucket)}}) - assert.Nil(t, err) - - req := &oss.IsObjectExistInput{ - Bucket: "test.bucket", - Key: "a.txt", - } - - out, err := cephOss.IsObjectExist(context.Background(), req) - assert.Nil(t, err) - printOutput(out) -} - -func TestCephOss_SignURL(t *testing.T) { - cephOss := NewCephOss() - err := cephOss.Init(context.TODO(), &oss.Config{Metadata: map[string]json.RawMessage{oss.BasicConfiguration: []byte(confWithoutUidAndBucket)}}) - assert.Nil(t, err) - - req := &oss.SignURLInput{ - Bucket: "test.bucket", - Key: "TestPut.txt", - Method: "Get", - } - - out, err := cephOss.SignURL(context.Background(), req) - assert.Nil(t, err) - printOutput(out) -} - -func createMultipartUpload(t *testing.T, cephOss oss.Oss, key string) (uploadId string) { - fmt.Println("=====[CreateMultipartUpload]") - req := &oss.CreateMultipartUploadInput{ - Bucket: "test.bucket", - Key: key, - } - out, err := cephOss.CreateMultipartUpload(context.Background(), req) - assert.Nil(t, err) - printOutput(out) - return out.UploadId -} -func uploadPart(t *testing.T, cephOss oss.Oss, key string, uploadId string, partNumber int32, dataStream io.Reader) (etag string) { - assert.True(t, (1 <= partNumber) && (partNumber <= 10000)) - req := &oss.UploadPartInput{ - Bucket: "test.bucket", - Key: key, - UploadId: uploadId, - PartNumber: partNumber, - DataStream: dataStream, - } - out, err := cephOss.UploadPart(context.Background(), req) - assert.Nil(t, err) - fmt.Printf("=====[UploadPart %d]\n", partNumber) - printOutput(out) - return out.ETag -} -func uploadPartCopy(t *testing.T, cephOss oss.Oss, uploadId string, partNumber int32) (etag string) { - assert.True(t, (1 <= partNumber) && (partNumber <= 10000)) - copySource := oss.CopySource{ - CopySourceBucket: "test.bucket", - CopySourceKey: "TestMultipartUpload", - } - req := &oss.UploadPartCopyInput{ - Bucket: "test.bucket", - Key: "TestUploadPartCopy", - UploadId: uploadId, - PartNumber: partNumber, - CopySource: ©Source, - } - out, err := cephOss.UploadPartCopy(context.Background(), req) - assert.Nil(t, err) - fmt.Printf("=====[UploadPartCopy %d]\n", partNumber) - printOutput(out) - return out.CopyPartResult.ETag -} -func abortMultipartUpload(t *testing.T, cephOss oss.Oss, key string, uploadId string) { - fmt.Println("=====[AbortMultipartUpload]") - req := &oss.AbortMultipartUploadInput{ - Bucket: "test.bucket", - Key: key, - UploadId: uploadId, - } - out, err := cephOss.AbortMultipartUpload(context.Background(), req) - assert.Nil(t, err) - printOutput(out) -} -func completeMultipartUpload(t *testing.T, cephOss oss.Oss, key string, uploadId string, eTag string, partNumber int32) { - fmt.Println("=====[CompleteMultipartUpload]") - multipartUpload := &oss.CompletedMultipartUpload{ - Parts: []*oss.CompletedPart{ - {ETag: eTag, PartNumber: partNumber}, - }, - } - req := &oss.CompleteMultipartUploadInput{ - Bucket: "test.bucket", - Key: key, - UploadId: uploadId, - MultipartUpload: multipartUpload, - } - out, err := cephOss.CompleteMultipartUpload(context.Background(), req) - assert.Nil(t, err) - printOutput(out) -} -func listMultipartUploads(t *testing.T, cephOss oss.Oss) { - time.Sleep(time.Second) - fmt.Println("=====[ListMultipartUploads]") - req := &oss.ListMultipartUploadsInput{ - Bucket: "test.bucket", - } - out, err := cephOss.ListMultipartUploads(context.Background(), req) - assert.Nil(t, err) - printOutput(out) -} -func listParts(t *testing.T, cephOss oss.Oss, key, uploadId string) { - time.Sleep(time.Second) - fmt.Println("=====[ListParts]") - req := &oss.ListPartsInput{ - Bucket: "test.bucket", - Key: key, - UploadId: uploadId, - } - out, err := cephOss.ListParts(context.Background(), req) - assert.Nil(t, err) - printOutput(out) -} - -func printOutput(v interface{}) { - bs, _ := json.Marshal(v) - var bf bytes.Buffer - err := json.Indent(&bf, bs, "", "\t") - if err != nil { - log.Fatalln("ERROR:", err) - return - } - fmt.Println(bf.String()) -} - func TestCephOss(t *testing.T) { instance := &CephOss{} err := instance.Init(context.TODO(), &oss.Config{Metadata: map[string]json.RawMessage{oss.BasicConfiguration: []byte(confWithoutUidAndBucket)}}) From e71cce90936515159fcff0a17ab2c15e8c2d9ab0 Mon Sep 17 00:00:00 2001 From: wlwilliamx Date: Tue, 30 Aug 2022 22:53:19 +0800 Subject: [PATCH 03/19] chore: update goimports --- sdk/go-sdk/client/client.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sdk/go-sdk/client/client.go b/sdk/go-sdk/client/client.go index decfb69c25..12a41a8f07 100644 --- a/sdk/go-sdk/client/client.go +++ b/sdk/go-sdk/client/client.go @@ -19,11 +19,12 @@ package client import ( "context" "log" - "mosn.io/layotto/spec/proto/extension/v1/s3" "net" "os" "sync" + "mosn.io/layotto/spec/proto/extension/v1/s3" + "github.com/pkg/errors" "google.golang.org/grpc" From 2e2e288576eede69d26e781bb17bd7417b8268b7 Mon Sep 17 00:00:00 2001 From: wlwilliamx Date: Tue, 30 Aug 2022 23:11:34 +0800 Subject: [PATCH 04/19] style: format code --- components/oss/ceph/oss.go | 1 - components/oss/ceph/oss_test.go | 3 ++- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/components/oss/ceph/oss.go b/components/oss/ceph/oss.go index da71977100..360dc5624a 100644 --- a/components/oss/ceph/oss.go +++ b/components/oss/ceph/oss.go @@ -354,7 +354,6 @@ func (c *CephOss) PutObjectCannedAcl(ctx context.Context, req *oss.PutObjectCann return &oss.PutObjectCannedAclOutput{RequestCharged: string(resp.RequestCharged)}, err } - func (c *CephOss) CreateMultipartUpload(ctx context.Context, req *oss.CreateMultipartUploadInput) (*oss.CreateMultipartUploadOutput, error) { client, err := c.getClient() if err != nil { diff --git a/components/oss/ceph/oss_test.go b/components/oss/ceph/oss_test.go index 448e2e2dc5..a7a9159033 100644 --- a/components/oss/ceph/oss_test.go +++ b/components/oss/ceph/oss_test.go @@ -20,9 +20,10 @@ import ( "context" "encoding/json" "errors" + "testing" + "github.com/stretchr/testify/assert" "mosn.io/pkg/buffer" - "testing" "mosn.io/layotto/components/oss" ) From 60d0aee5f267818dbdd6c281a8ae832e7f7c6a18 Mon Sep 17 00:00:00 2001 From: wlwilliamx Date: Fri, 16 Sep 2022 22:12:09 +0800 Subject: [PATCH 05/19] style(ceph): format code Move components/oss/ceph/option.go, components/oss/ceph/option_test.go, components/oss/aws/option.go and components/oss/aws/option_test.go to components/oss/ --- components/oss/aws/oss.go | 8 +-- components/oss/ceph/option.go | 43 --------------- components/oss/ceph/option_test.go | 52 ------------------ components/oss/ceph/oss.go | 70 ++++++++++++------------- components/oss/ceph/oss_test.go | 4 +- components/oss/{aws => }/option.go | 6 +-- components/oss/{aws => }/option_test.go | 6 +-- 7 files changed, 47 insertions(+), 142 deletions(-) delete mode 100644 components/oss/ceph/option.go delete mode 100644 components/oss/ceph/option_test.go rename components/oss/{aws => }/option.go (91%) rename components/oss/{aws => }/option_test.go (93%) diff --git a/components/oss/aws/oss.go b/components/oss/aws/oss.go index 7573e3bd7c..674122733b 100644 --- a/components/oss/aws/oss.go +++ b/components/oss/aws/oss.go @@ -260,7 +260,7 @@ func (a *AwsOss) ListObjects(ctx context.Context, req *oss.ListObjectsInput) (*o return nil, err } output := &oss.ListObjectsOutput{} - err = copier.CopyWithOption(output, resp, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{time2int64}}) + err = copier.CopyWithOption(output, resp, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{oss.TimeToInt64}}) // if not return NextMarker, use the value of the last Key in the response as the marker if output.IsTruncated && output.NextMarker == "" { index := len(output.Contents) - 1 @@ -304,7 +304,7 @@ func (a *AwsOss) CreateMultipartUpload(ctx context.Context, req *oss.CreateMulti return nil, err } input := &s3.CreateMultipartUploadInput{} - err = copier.CopyWithOption(input, req, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{int642time}}) + err = copier.CopyWithOption(input, req, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{oss.Int64ToTime}}) if err != nil { log.DefaultLogger.Errorf("copy CreateMultipartUploadInput fail, err: %+v", err) return nil, err @@ -314,7 +314,7 @@ func (a *AwsOss) CreateMultipartUpload(ctx context.Context, req *oss.CreateMulti return nil, err } output := &oss.CreateMultipartUploadOutput{} - copier.CopyWithOption(output, resp, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{time2int64}}) + copier.CopyWithOption(output, resp, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{oss.TimeToInt64}}) return output, err } func (a *AwsOss) UploadPart(ctx context.Context, req *oss.UploadPartInput) (*oss.UploadPartOutput, error) { @@ -460,7 +460,7 @@ func (a *AwsOss) ListObjectVersions(ctx context.Context, req *oss.ListObjectVers } for _, v := range resp.Versions { version := &oss.ObjectVersion{} - copier.CopyWithOption(version, v, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{time2int64}}) + copier.CopyWithOption(version, v, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{oss.TimeToInt64}}) output.Versions = append(output.Versions, version) } return output, err diff --git a/components/oss/ceph/option.go b/components/oss/ceph/option.go deleted file mode 100644 index c97cffb309..0000000000 --- a/components/oss/ceph/option.go +++ /dev/null @@ -1,43 +0,0 @@ -/* -* Copyright 2021 Layotto Authors -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. - */ - -package ceph - -import ( - "time" - - "github.com/jinzhu/copier" -) - -var ( - int642time = copier.TypeConverter{ - SrcType: int64(0), - DstType: &time.Time{}, - Fn: func(src interface{}) (interface{}, error) { - s, _ := src.(int64) - t := time.Unix(s, 0) - return &t, nil - }, - } - time2int64 = copier.TypeConverter{ - SrcType: &time.Time{}, - DstType: int64(0), - Fn: func(src interface{}) (interface{}, error) { - s, _ := src.(*time.Time) - return s.Unix(), nil - }, - } -) diff --git a/components/oss/ceph/option_test.go b/components/oss/ceph/option_test.go deleted file mode 100644 index d2a2c39652..0000000000 --- a/components/oss/ceph/option_test.go +++ /dev/null @@ -1,52 +0,0 @@ -/* -* Copyright 2021 Layotto Authors -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. - */ - -package ceph - -import ( - "testing" - "time" - - "github.com/stretchr/testify/assert" - - "github.com/jinzhu/copier" -) - -func TestCopierOption(t *testing.T) { - type ValueWithInt64 struct { - TestString string - TestInt64toTime int64 - } - - type ValueWithTimer struct { - TestString *string - TestInt64toTime *time.Time - } - timer := time.Now().Unix() - srcValue := &ValueWithInt64{TestInt64toTime: timer} - destValue := &ValueWithTimer{} - err := copier.CopyWithOption(destValue, srcValue, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{int642time}}) - assert.Nil(t, err) - assert.Nil(t, destValue.TestString) - assert.Equal(t, timer, destValue.TestInt64toTime.Unix()) - - ti := time.Now() - src := &ValueWithTimer{TestInt64toTime: &ti} - dst := &ValueWithInt64{} - err = copier.CopyWithOption(dst, src, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{time2int64}}) - assert.Nil(t, err) - assert.Equal(t, ti.Unix(), dst.TestInt64toTime) -} diff --git a/components/oss/ceph/oss.go b/components/oss/ceph/oss.go index 360dc5624a..fdec8fc6a8 100644 --- a/components/oss/ceph/oss.go +++ b/components/oss/ceph/oss.go @@ -39,16 +39,16 @@ import ( "mosn.io/layotto/components/pkg/utils" ) -type CephOss struct { +type CephOSS struct { client *s3.Client basicConf json.RawMessage } func NewCephOss() oss.Oss { - return &CephOss{} + return &CephOSS{} } -func (c *CephOss) Init(ctx context.Context, config *oss.Config) error { +func (c *CephOSS) Init(ctx context.Context, config *oss.Config) error { c.basicConf = config.Metadata[oss.BasicConfiguration] m := &utils.OssMetadata{} err := json.Unmarshal(c.basicConf, &m) @@ -82,7 +82,7 @@ func (c *CephOss) Init(ctx context.Context, config *oss.Config) error { return nil } -func (c *CephOss) GetObject(ctx context.Context, req *oss.GetObjectInput) (*oss.GetObjectOutput, error) { +func (c *CephOSS) GetObject(ctx context.Context, req *oss.GetObjectInput) (*oss.GetObjectOutput, error) { client, err := c.getClient() if err != nil { return nil, err @@ -107,7 +107,7 @@ func (c *CephOss) GetObject(ctx context.Context, req *oss.GetObjectInput) (*oss. return out, nil } -func (c *CephOss) PutObject(ctx context.Context, req *oss.PutObjectInput) (*oss.PutObjectOutput, error) { +func (c *CephOSS) PutObject(ctx context.Context, req *oss.PutObjectInput) (*oss.PutObjectOutput, error) { client, err := c.getClient() if err != nil { return nil, err @@ -133,7 +133,7 @@ func (c *CephOss) PutObject(ctx context.Context, req *oss.PutObjectInput) (*oss. return out, err } -func (c *CephOss) DeleteObject(ctx context.Context, req *oss.DeleteObjectInput) (*oss.DeleteObjectOutput, error) { +func (c *CephOSS) DeleteObject(ctx context.Context, req *oss.DeleteObjectInput) (*oss.DeleteObjectOutput, error) { client, err := c.getClient() if err != nil { return nil, err @@ -155,7 +155,7 @@ func (c *CephOss) DeleteObject(ctx context.Context, req *oss.DeleteObjectInput) return &oss.DeleteObjectOutput{DeleteMarker: resp.DeleteMarker, RequestCharged: string(resp.RequestCharged), VersionId: versionId}, err } -func (c *CephOss) PutObjectTagging(ctx context.Context, req *oss.PutObjectTaggingInput) (*oss.PutObjectTaggingOutput, error) { +func (c *CephOSS) PutObjectTagging(ctx context.Context, req *oss.PutObjectTaggingInput) (*oss.PutObjectTaggingOutput, error) { client, err := c.getClient() if err != nil { return nil, err @@ -175,7 +175,7 @@ func (c *CephOss) PutObjectTagging(ctx context.Context, req *oss.PutObjectTaggin return &oss.PutObjectTaggingOutput{}, err } -func (c *CephOss) DeleteObjectTagging(ctx context.Context, req *oss.DeleteObjectTaggingInput) (*oss.DeleteObjectTaggingOutput, error) { +func (c *CephOSS) DeleteObjectTagging(ctx context.Context, req *oss.DeleteObjectTaggingInput) (*oss.DeleteObjectTaggingOutput, error) { client, err := c.getClient() if err != nil { return nil, err @@ -198,7 +198,7 @@ func (c *CephOss) DeleteObjectTagging(ctx context.Context, req *oss.DeleteObject return &oss.DeleteObjectTaggingOutput{VersionId: versionId}, err } -func (c *CephOss) GetObjectTagging(ctx context.Context, req *oss.GetObjectTaggingInput) (*oss.GetObjectTaggingOutput, error) { +func (c *CephOSS) GetObjectTagging(ctx context.Context, req *oss.GetObjectTaggingInput) (*oss.GetObjectTaggingOutput, error) { client, err := c.getClient() if err != nil { return nil, err @@ -221,7 +221,7 @@ func (c *CephOss) GetObjectTagging(ctx context.Context, req *oss.GetObjectTaggin return output, err } -func (c *CephOss) CopyObject(ctx context.Context, req *oss.CopyObjectInput) (*oss.CopyObjectOutput, error) { +func (c *CephOSS) CopyObject(ctx context.Context, req *oss.CopyObjectInput) (*oss.CopyObjectOutput, error) { client, err := c.getClient() if err != nil { return nil, err @@ -232,7 +232,7 @@ func (c *CephOss) CopyObject(ctx context.Context, req *oss.CopyObjectInput) (*os } input := &s3.CopyObjectInput{} - err = copier.CopyWithOption(input, req, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{int642time}}) + err = copier.CopyWithOption(input, req, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{oss.Int64ToTime}}) if err != nil { return nil, err } @@ -254,7 +254,7 @@ func (c *CephOss) CopyObject(ctx context.Context, req *oss.CopyObjectInput) (*os return out, err } -func (c *CephOss) DeleteObjects(ctx context.Context, req *oss.DeleteObjectsInput) (*oss.DeleteObjectsOutput, error) { +func (c *CephOSS) DeleteObjects(ctx context.Context, req *oss.DeleteObjectsInput) (*oss.DeleteObjectsOutput, error) { client, err := c.getClient() if err != nil { return nil, err @@ -284,7 +284,7 @@ func (c *CephOss) DeleteObjects(ctx context.Context, req *oss.DeleteObjectsInput return output, err } -func (c *CephOss) ListObjects(ctx context.Context, req *oss.ListObjectsInput) (*oss.ListObjectsOutput, error) { +func (c *CephOSS) ListObjects(ctx context.Context, req *oss.ListObjectsInput) (*oss.ListObjectsOutput, error) { client, err := c.getClient() if err != nil { return nil, err @@ -301,7 +301,7 @@ func (c *CephOss) ListObjects(ctx context.Context, req *oss.ListObjectsInput) (* } output := &oss.ListObjectsOutput{} - err = copier.CopyWithOption(output, resp, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{time2int64}}) + err = copier.CopyWithOption(output, resp, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{oss.TimeToInt64}}) // if not return NextMarker, use the value of the last Key in the response as the marker if output.IsTruncated && output.NextMarker == "" { index := len(output.Contents) - 1 @@ -310,7 +310,7 @@ func (c *CephOss) ListObjects(ctx context.Context, req *oss.ListObjectsInput) (* return output, err } -func (c *CephOss) GetObjectCannedAcl(ctx context.Context, req *oss.GetObjectCannedAclInput) (*oss.GetObjectCannedAclOutput, error) { +func (c *CephOSS) GetObjectCannedAcl(ctx context.Context, req *oss.GetObjectCannedAclInput) (*oss.GetObjectCannedAclOutput, error) { client, err := c.getClient() if err != nil { return nil, err @@ -341,7 +341,7 @@ func (c *CephOss) GetObjectCannedAcl(ctx context.Context, req *oss.GetObjectCann return out, nil } -func (c *CephOss) PutObjectCannedAcl(ctx context.Context, req *oss.PutObjectCannedAclInput) (*oss.PutObjectCannedAclOutput, error) { +func (c *CephOSS) PutObjectCannedAcl(ctx context.Context, req *oss.PutObjectCannedAclInput) (*oss.PutObjectCannedAclOutput, error) { client, err := c.getClient() if err != nil { return nil, err @@ -354,14 +354,14 @@ func (c *CephOss) PutObjectCannedAcl(ctx context.Context, req *oss.PutObjectCann return &oss.PutObjectCannedAclOutput{RequestCharged: string(resp.RequestCharged)}, err } -func (c *CephOss) CreateMultipartUpload(ctx context.Context, req *oss.CreateMultipartUploadInput) (*oss.CreateMultipartUploadOutput, error) { +func (c *CephOSS) CreateMultipartUpload(ctx context.Context, req *oss.CreateMultipartUploadInput) (*oss.CreateMultipartUploadOutput, error) { client, err := c.getClient() if err != nil { return nil, err } input := &s3.CreateMultipartUploadInput{} - err = copier.CopyWithOption(input, req, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{int642time}}) + err = copier.CopyWithOption(input, req, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{oss.Int64ToTime}}) if err != nil { log.DefaultLogger.Errorf("copy CreateMultipartUploadInput fail, err: %+v", err) return nil, err @@ -372,11 +372,11 @@ func (c *CephOss) CreateMultipartUpload(ctx context.Context, req *oss.CreateMult } output := &oss.CreateMultipartUploadOutput{} - copier.CopyWithOption(output, resp, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{time2int64}}) + copier.CopyWithOption(output, resp, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{oss.TimeToInt64}}) return output, err } -func (c *CephOss) UploadPart(ctx context.Context, req *oss.UploadPartInput) (*oss.UploadPartOutput, error) { +func (c *CephOSS) UploadPart(ctx context.Context, req *oss.UploadPartInput) (*oss.UploadPartOutput, error) { client, err := c.getClient() if err != nil { return nil, err @@ -401,7 +401,7 @@ func (c *CephOss) UploadPart(ctx context.Context, req *oss.UploadPartInput) (*os return output, err } -func (c *CephOss) UploadPartCopy(ctx context.Context, req *oss.UploadPartCopyInput) (*oss.UploadPartCopyOutput, error) { +func (c *CephOSS) UploadPartCopy(ctx context.Context, req *oss.UploadPartCopyInput) (*oss.UploadPartCopyOutput, error) { client, err := c.getClient() if err != nil { return nil, err @@ -430,7 +430,7 @@ func (c *CephOss) UploadPartCopy(ctx context.Context, req *oss.UploadPartCopyInp return out, err } -func (c *CephOss) CompleteMultipartUpload(ctx context.Context, req *oss.CompleteMultipartUploadInput) (*oss.CompleteMultipartUploadOutput, error) { +func (c *CephOSS) CompleteMultipartUpload(ctx context.Context, req *oss.CompleteMultipartUploadInput) (*oss.CompleteMultipartUploadOutput, error) { client, err := c.getClient() if err != nil { return nil, err @@ -451,7 +451,7 @@ func (c *CephOss) CompleteMultipartUpload(ctx context.Context, req *oss.Complete return output, err } -func (c *CephOss) AbortMultipartUpload(ctx context.Context, req *oss.AbortMultipartUploadInput) (*oss.AbortMultipartUploadOutput, error) { +func (c *CephOSS) AbortMultipartUpload(ctx context.Context, req *oss.AbortMultipartUploadInput) (*oss.AbortMultipartUploadOutput, error) { client, err := c.getClient() if err != nil { return nil, err @@ -473,7 +473,7 @@ func (c *CephOss) AbortMultipartUpload(ctx context.Context, req *oss.AbortMultip return output, err } -func (c *CephOss) ListParts(ctx context.Context, req *oss.ListPartsInput) (*oss.ListPartsOutput, error) { +func (c *CephOSS) ListParts(ctx context.Context, req *oss.ListPartsInput) (*oss.ListPartsOutput, error) { client, err := c.getClient() if err != nil { return nil, err @@ -497,7 +497,7 @@ func (c *CephOss) ListParts(ctx context.Context, req *oss.ListPartsInput) (*oss. return output, err } -func (c *CephOss) ListMultipartUploads(ctx context.Context, req *oss.ListMultipartUploadsInput) (*oss.ListMultipartUploadsOutput, error) { +func (c *CephOSS) ListMultipartUploads(ctx context.Context, req *oss.ListMultipartUploadsInput) (*oss.ListMultipartUploadsOutput, error) { client, err := c.getClient() if err != nil { return nil, err @@ -529,7 +529,7 @@ func (c *CephOss) ListMultipartUploads(ctx context.Context, req *oss.ListMultipa return output, err } -func (c *CephOss) ListObjectVersions(ctx context.Context, req *oss.ListObjectVersionsInput) (*oss.ListObjectVersionsOutput, error) { +func (c *CephOSS) ListObjectVersions(ctx context.Context, req *oss.ListObjectVersionsInput) (*oss.ListObjectVersionsOutput, error) { client, err := c.getClient() if err != nil { return nil, err @@ -559,13 +559,13 @@ func (c *CephOss) ListObjectVersions(ctx context.Context, req *oss.ListObjectVer } for _, v := range resp.Versions { version := &oss.ObjectVersion{} - copier.CopyWithOption(version, v, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{time2int64}}) + copier.CopyWithOption(version, v, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{oss.TimeToInt64}}) output.Versions = append(output.Versions, version) } return output, err } -func (c *CephOss) HeadObject(ctx context.Context, req *oss.HeadObjectInput) (*oss.HeadObjectOutput, error) { +func (c *CephOSS) HeadObject(ctx context.Context, req *oss.HeadObjectInput) (*oss.HeadObjectOutput, error) { client, err := c.getClient() if err != nil { return nil, err @@ -582,7 +582,7 @@ func (c *CephOss) HeadObject(ctx context.Context, req *oss.HeadObjectInput) (*os return &oss.HeadObjectOutput{ResultMetadata: resp.Metadata}, nil } -func (c *CephOss) IsObjectExist(ctx context.Context, req *oss.IsObjectExistInput) (*oss.IsObjectExistOutput, error) { +func (c *CephOSS) IsObjectExist(ctx context.Context, req *oss.IsObjectExistInput) (*oss.IsObjectExistOutput, error) { client, err := c.getClient() if err != nil { return nil, err @@ -599,7 +599,7 @@ func (c *CephOss) IsObjectExist(ctx context.Context, req *oss.IsObjectExistInput return &oss.IsObjectExistOutput{FileExist: true}, nil } -func (c *CephOss) SignURL(ctx context.Context, req *oss.SignURLInput) (*oss.SignURLOutput, error) { +func (c *CephOSS) SignURL(ctx context.Context, req *oss.SignURLInput) (*oss.SignURLOutput, error) { client, err := c.getClient() if err != nil { return nil, err @@ -625,22 +625,22 @@ func (c *CephOss) SignURL(ctx context.Context, req *oss.SignURLInput) (*oss.Sign } } -func (c *CephOss) RestoreObject(ctx context.Context, req *oss.RestoreObjectInput) (*oss.RestoreObjectOutput, error) { +func (c *CephOSS) RestoreObject(ctx context.Context, req *oss.RestoreObjectInput) (*oss.RestoreObjectOutput, error) { return nil, errors.New("RestoreObject method not supported on AWS") } -func (c *CephOss) UpdateDownloadBandwidthRateLimit(ctx context.Context, req *oss.UpdateBandwidthRateLimitInput) error { +func (c *CephOSS) UpdateDownloadBandwidthRateLimit(ctx context.Context, req *oss.UpdateBandwidthRateLimitInput) error { return errors.New("UpdateDownloadBandwidthRateLimit method not supported now") } -func (c *CephOss) UpdateUploadBandwidthRateLimit(ctx context.Context, req *oss.UpdateBandwidthRateLimitInput) error { +func (c *CephOSS) UpdateUploadBandwidthRateLimit(ctx context.Context, req *oss.UpdateBandwidthRateLimitInput) error { return errors.New("UpdateUploadBandwidthRateLimit method not supported now") } -func (c *CephOss) AppendObject(ctx context.Context, req *oss.AppendObjectInput) (*oss.AppendObjectOutput, error) { +func (c *CephOSS) AppendObject(ctx context.Context, req *oss.AppendObjectInput) (*oss.AppendObjectOutput, error) { return nil, errors.New("AppendObject method not supported on AWS") } -func (c *CephOss) getClient() (*s3.Client, error) { +func (c *CephOSS) getClient() (*s3.Client, error) { if c.client == nil { return nil, utils.ErrNotInitClient } diff --git a/components/oss/ceph/oss_test.go b/components/oss/ceph/oss_test.go index a7a9159033..21240a872c 100644 --- a/components/oss/ceph/oss_test.go +++ b/components/oss/ceph/oss_test.go @@ -39,14 +39,14 @@ const ( ) func TestCephDefaultInitFunc(t *testing.T) { - a := &CephOss{} + a := &CephOSS{} err := a.Init(context.TODO(), &oss.Config{Metadata: map[string]json.RawMessage{oss.BasicConfiguration: []byte("hello")}}) assert.Equal(t, err, oss.ErrInvalid) assert.Nil(t, a.client) } func TestCephOss(t *testing.T) { - instance := &CephOss{} + instance := &CephOSS{} err := instance.Init(context.TODO(), &oss.Config{Metadata: map[string]json.RawMessage{oss.BasicConfiguration: []byte(confWithoutUidAndBucket)}}) assert.Nil(t, err) diff --git a/components/oss/aws/option.go b/components/oss/option.go similarity index 91% rename from components/oss/aws/option.go rename to components/oss/option.go index 7869a46acf..7511451365 100644 --- a/components/oss/aws/option.go +++ b/components/oss/option.go @@ -14,7 +14,7 @@ * limitations under the License. */ -package aws +package oss import ( "time" @@ -23,7 +23,7 @@ import ( ) var ( - int642time = copier.TypeConverter{ + Int64ToTime = copier.TypeConverter{ SrcType: int64(0), DstType: &time.Time{}, Fn: func(src interface{}) (interface{}, error) { @@ -32,7 +32,7 @@ var ( return &t, nil }, } - time2int64 = copier.TypeConverter{ + TimeToInt64 = copier.TypeConverter{ SrcType: &time.Time{}, DstType: int64(0), Fn: func(src interface{}) (interface{}, error) { diff --git a/components/oss/aws/option_test.go b/components/oss/option_test.go similarity index 93% rename from components/oss/aws/option_test.go rename to components/oss/option_test.go index 4ea5f0f766..e05950517d 100644 --- a/components/oss/aws/option_test.go +++ b/components/oss/option_test.go @@ -14,7 +14,7 @@ * limitations under the License. */ -package aws +package oss import ( "testing" @@ -38,7 +38,7 @@ func TestCopierOption(t *testing.T) { timer := time.Now().Unix() srcValue := &ValueWithInt64{TestInt64toTime: timer} destValue := &ValueWithTimer{} - err := copier.CopyWithOption(destValue, srcValue, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{int642time}}) + err := copier.CopyWithOption(destValue, srcValue, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{Int64ToTime}}) assert.Nil(t, err) assert.Nil(t, destValue.TestString) assert.Equal(t, timer, destValue.TestInt64toTime.Unix()) @@ -46,7 +46,7 @@ func TestCopierOption(t *testing.T) { ti := time.Now() src := &ValueWithTimer{TestInt64toTime: &ti} dst := &ValueWithInt64{} - err = copier.CopyWithOption(dst, src, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{time2int64}}) + err = copier.CopyWithOption(dst, src, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{TimeToInt64}}) assert.Nil(t, err) assert.Equal(t, ti.Unix(), dst.TestInt64toTime) } From 8aa327ee68bf4c9f2d6dea06ef2c9bc54c94b6a7 Mon Sep 17 00:00:00 2001 From: wlwilliamx Date: Fri, 16 Sep 2022 22:31:14 +0800 Subject: [PATCH 06/19] chore(proto): regenerate proto code --- docs/api/v1/runtime.html | 3 +- docs/api/v1/s3.html | 439 ++++++++++++++++++++++++++ docs/en/api_reference/README.md | 4 + docs/zh/api_reference/README.md | 4 + pkg/grpc/context_generated.go | 38 ++- pkg/runtime/component_generated.go | 84 ++++- pkg/runtime/config_generated.go | 14 + pkg/runtime/context_generated.go | 9 +- pkg/runtime/options_generated.go | 26 +- sdk/go-sdk/client/client.go | 2 - sdk/go-sdk/client/client_generated.go | 56 ++-- spec/proto/extension/v1/s3/oss.pb.go | 5 +- spec/proto/runtime/v1/lifecycle.pb.go | 2 +- 13 files changed, 639 insertions(+), 47 deletions(-) diff --git a/docs/api/v1/runtime.html b/docs/api/v1/runtime.html index c2c75b24fc..b7ac890a07 100644 --- a/docs/api/v1/runtime.html +++ b/docs/api/v1/runtime.html @@ -936,7 +936,8 @@

[gRPC Service] Lifecycle

ApplyConfiguration DynamicConfiguration ApplyConfigurationResponse -

apply the dynamic configuration

+

Apply the dynamic configuration. +The DynamicConfiguration here should be full configuration, not incremental configuration

diff --git a/docs/api/v1/s3.html b/docs/api/v1/s3.html index 4b17da38b6..821d8fd420 100644 --- a/docs/api/v1/s3.html +++ b/docs/api/v1/s3.html @@ -199,6 +199,14 @@

Table of Contents

MAppendObjectOutput +
  • + MCSVInput +
  • + +
  • + MCSVOutput +
  • +
  • MCompleteMultipartUploadInput
  • @@ -335,6 +343,10 @@

    Table of Contents

    MGetObjectTaggingOutput.TagsEntry +
  • + MGlacierJobParameters +
  • +
  • MHeadObjectInput
  • @@ -351,6 +363,10 @@

    Table of Contents

    MInitiator +
  • + MInputSerialization +
  • +
  • MIsObjectExistInput
  • @@ -407,6 +423,14 @@

    Table of Contents

    MObjectVersion +
  • + MOutputLocation +
  • + +
  • + MOutputSerialization +
  • +
  • MOwner
  • @@ -463,6 +487,14 @@

    Table of Contents

    MRestoreObjectOutput +
  • + MRestoreRequest +
  • + +
  • + MSelectParameters +
  • +
  • MSignURLInput
  • @@ -1005,6 +1037,156 @@

    AppendObjectOutput

    +

    CSVInput

    +

    CSVInput

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    FieldTypeLabelDescription
    allow_quoted_record_delimiterbool

    Specifies that CSV field values may contain quoted record delimiters and such +records should be allowed. Default value is FALSE. Setting this value to TRUE +may lower performance.

    commentsstring

    A single character used to indicate that a row should be ignored when the +character is present at the start of that row. You can specify any character to +indicate a comment line.

    field_delimiterstring

    A single character used to separate individual fields in a record. You can +specify an arbitrary delimiter.

    file_header_infostring

    Describes the first line of input. Valid values are: + +* NONE: First line is not +a header. + +* IGNORE: First line is a header, but you can't use the header values +to indicate the column in an expression. You can use column position (such as +_1, _2, …) to indicate the column (SELECT s._1 FROM OBJECT s). + +* Use: First +line is a header, and you can use the header value to identify a column in an +expression (SELECT "name" FROM OBJECT).

    quote_characterstring

    A single character used for escaping when the field delimiter is part of the +value. For example, if the value is a, b, Amazon S3 wraps this field value in +quotation marks, as follows: " a , b ". Type: String Default: " Ancestors: CSV

    quote_escape_characterstring

    A single character used for escaping the quotation mark character inside an +already escaped value. For example, the value """ a , b """ is parsed as " a , b +".

    record_delimiterstring

    A single character used to separate individual records in the input. Instead of +the default value, you can specify an arbitrary delimiter.

    + + + + + +

    CSVOutput

    +

    CSVOutput

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    FieldTypeLabelDescription
    field_delimiterstring

    The value used to separate individual fields in a record. You can specify an +arbitrary delimiter.

    quote_characterstring

    A single character used for escaping when the field delimiter is part of the +value. For example, if the value is a, b, Amazon S3 wraps this field value in +quotation marks, as follows: " a , b ".

    quote_escape_characterstring

    The single character used for escaping the quote character inside an already +escaped value.

    quote_fieldsstring

    Indicates whether to use quotation marks around output fields. + +* ALWAYS: Always +use quotation marks for output fields. + +* ASNEEDED: Use quotation marks for +output fields when needed.

    record_delimiterstring

    A single character used to separate individual records in the output. Instead of +the default value, you can specify an arbitrary delimiter.

    + + + + +

    CompleteMultipartUploadInput

    CompleteMultipartUploadInput

    @@ -2972,6 +3154,31 @@

    GetObjectTa +

    GlacierJobParameters

    +

    GlacierJobParameters

    + + + + + + + + + + + + + + + + +
    FieldTypeLabelDescription
    tierstring

    Retrieval tier at which the restore will be processed. +This member is required.

    + + + + +

    HeadObjectInput

    HeadObjectInput

    @@ -3197,6 +3404,45 @@

    Initiator

    +

    InputSerialization

    +

    InputSerialization

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    FieldTypeLabelDescription
    csvCSVInput

    Describes the serialization of a CSV-encoded object.

    compression_typestring

    Specifies object's compression format. Valid values: NONE, GZIP, BZIP2. Default +Value: NONE.

    jsonstring

    Specifies JSON as object's input serialization format.

    + + + + +

    IsObjectExistInput

    IsObjectExistInput

    @@ -4250,6 +4496,70 @@

    ObjectVersion

    +

    OutputLocation

    +

    OutPutLocation

    + + + + + + + + + + + + + + + + + + + + + + + +
    FieldTypeLabelDescription
    bucket_namestring

    The name of the bucket where the restore results will be placed. +This member is required.

    prefixstring

    The prefix that is prepended to the restore results for this request. +This member is required.

    + + + + + +

    OutputSerialization

    +

    OutputSerialization

    + + + + + + + + + + + + + + + + + + + + + + + +
    FieldTypeLabelDescription
    csvCSVOutput

    Describes the serialization of CSV-encoded Select results.

    jsonstring

    Specifies JSON as request's output serialization format.

    + + + + +

    Owner

    Owner

    @@ -4524,6 +4834,13 @@

    PutObjectInput

    The tag-set for the object. The tag-set must be encoded as URL Query parameters.

    + + storage_class + string + +

    Storage class options.

    + + @@ -4826,6 +5143,13 @@

    RestoreObjectInput

    This member is required.

    + + restore_request + RestoreRequest + +

    The information of restoring request.

    + + version_id string @@ -4873,6 +5197,121 @@

    RestoreObjectOutput

    +

    RestoreRequest

    +

    RestoreRequest

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    FieldTypeLabelDescription
    daysint32

    Lifetime of the active copy in days.

    descriptionstring

    The optional description for the job.

    glacier_job_parametersGlacierJobParameters

    S3 Glacier related parameters pertaining to this job.

    output_locationOutputLocation

    Describes the location where the restore job's output is stored.

    select_parametersSelectParameters

    Describes the parameters for Select job types.

    tierstring

    Retrieval tier at which the restore will be processed.

    typestring

    Type of restore request.

    + + + + + +

    SelectParameters

    +

    SelectParameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    FieldTypeLabelDescription
    expressionstring

    The expression that is used to query the object. +This member is required.

    expression_typestring

    The type of the provided expression (for example, SQL). +This member is required.

    input_serializationInputSerialization

    Describes the serialization format of the object. +This member is required.

    output_serializationOutputSerialization

    Describes how the results of the Select job are serialized. +This member is required.

    + + + + +

    SignURLInput

    SignURLInput

    diff --git a/docs/en/api_reference/README.md b/docs/en/api_reference/README.md index 7d98ef9fcc..dfc9097e5c 100644 --- a/docs/en/api_reference/README.md +++ b/docs/en/api_reference/README.md @@ -11,4 +11,8 @@ These protos define Layotto's runtime API, including: In addition to this, Layotto also provides some extension APIs, including: +email: [spec/proto/extension/v1/email](https://mosn.io/layotto/api/v1/email.html) + +phone: [spec/proto/extension/v1/phone](https://mosn.io/layotto/api/v1/phone.html) + s3: [spec/proto/extension/v1/s3](https://mosn.io/layotto/api/v1/s3.html) diff --git a/docs/zh/api_reference/README.md b/docs/zh/api_reference/README.md index c5b88649d3..e0a717e23d 100644 --- a/docs/zh/api_reference/README.md +++ b/docs/zh/api_reference/README.md @@ -11,4 +11,8 @@ Layotto 有多个 gRPC proto 文件, 对应的接口文档在: 除此之外,Layotto 还提供了一些扩展 API,包括: +email: [spec/proto/extension/v1/email](https://mosn.io/layotto/api/v1/email.html) + +phone: [spec/proto/extension/v1/phone](https://mosn.io/layotto/api/v1/phone.html) + s3: [spec/proto/extension/v1/s3](https://mosn.io/layotto/api/v1/s3.html) diff --git a/pkg/grpc/context_generated.go b/pkg/grpc/context_generated.go index 28d6d2c71b..2f6b642923 100644 --- a/pkg/grpc/context_generated.go +++ b/pkg/grpc/context_generated.go @@ -1,3 +1,5 @@ +// Code generated by github.com/seeflood/protoc-gen-p6 . + // Copyright 2021 Layotto Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -14,26 +16,27 @@ package grpc import ( - "github.com/dapr/components-contrib/bindings" - "github.com/dapr/components-contrib/pubsub" - "github.com/dapr/components-contrib/secretstores" - "github.com/dapr/components-contrib/state" - - "mosn.io/layotto/components/pkg/common" - "mosn.io/layotto/pkg/runtime/lifecycle" + bindings "github.com/dapr/components-contrib/bindings" + pubsub "github.com/dapr/components-contrib/pubsub" + secretstores "github.com/dapr/components-contrib/secretstores" + state "github.com/dapr/components-contrib/state" - "mosn.io/layotto/components/configstores" - "mosn.io/layotto/components/custom" - "mosn.io/layotto/components/file" - "mosn.io/layotto/components/hello" - "mosn.io/layotto/components/lock" - "mosn.io/layotto/components/oss" - "mosn.io/layotto/components/rpc" - "mosn.io/layotto/components/sequencer" + configstores "mosn.io/layotto/components/configstores" + custom "mosn.io/layotto/components/custom" + email "mosn.io/layotto/components/email" + file "mosn.io/layotto/components/file" + hello "mosn.io/layotto/components/hello" + lock "mosn.io/layotto/components/lock" + oss "mosn.io/layotto/components/oss" + phone "mosn.io/layotto/components/phone" + common "mosn.io/layotto/components/pkg/common" + rpc "mosn.io/layotto/components/rpc" + sequencer "mosn.io/layotto/components/sequencer" + lifecycle "mosn.io/layotto/pkg/runtime/lifecycle" ) // ApplicationContext contains all you need to construct your GrpcAPI, such as all the components. -// For example, your `SuperState` GrpcAPI can hold the `StateStores` components and use them to implement your own `Super State API` logic. +// For example, your "SuperState" GrpcAPI can hold the "StateStores" components and use them to implement your own "Super State API" logic. type ApplicationContext struct { AppId string Hellos map[string]hello.HelloService @@ -49,4 +52,7 @@ type ApplicationContext struct { SecretStores map[string]secretstores.SecretStore DynamicComponents map[lifecycle.ComponentKey]common.DynamicComponent CustomComponent map[string]map[string]custom.Component + EmailService map[string]email.EmailService + + PhoneCallService map[string]phone.PhoneCallService } diff --git a/pkg/runtime/component_generated.go b/pkg/runtime/component_generated.go index 14c8fb770f..eda24a5da9 100644 --- a/pkg/runtime/component_generated.go +++ b/pkg/runtime/component_generated.go @@ -1,3 +1,5 @@ +// Code generated by github.com/seeflood/protoc-gen-p6 . + // Copyright 2021 Layotto Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -13,13 +15,93 @@ package runtime +import ( + "context" + + "mosn.io/pkg/log" + + email "mosn.io/layotto/components/email" + phone "mosn.io/layotto/components/phone" +) + type extensionComponents struct { + emailService map[string]email.EmailService + + phoneCallService map[string]phone.PhoneCallService } func newExtensionComponents() *extensionComponents { - return &extensionComponents{} + return &extensionComponents{ + emailService: make(map[string]email.EmailService), + + phoneCallService: make(map[string]phone.PhoneCallService), + } +} + +func (m *MosnRuntime) initEmailService(factorys ...*email.Factory) error { + log.DefaultLogger.Infof("[runtime] init EmailService") + + // 1. register all implementation + reg := email.NewRegistry(m.info) + reg.Register(factorys...) + // 2. loop initializing + for name, config := range m.runtimeConfig.EmailService { + // 2.1. create the component + c, err := reg.Create(config.Type) + if err != nil { + m.errInt(err, "create the component %s failed", name) + return err + } + //inject secret to component + if config.Metadata, err = m.Injector.InjectSecretRef(config.SecretRef, config.Metadata); err != nil { + return err + } + // 2.2. init + if err := c.Init(context.TODO(), &config); err != nil { + m.errInt(err, "init the component %s failed", name) + return err + } + m.emailService[name] = c + } + return nil +} + +func (m *MosnRuntime) initPhoneCallService(factorys ...*phone.Factory) error { + log.DefaultLogger.Infof("[runtime] init PhoneCallService") + + // 1. register all implementation + reg := phone.NewRegistry(m.info) + reg.Register(factorys...) + // 2. loop initializing + for name, config := range m.runtimeConfig.PhoneCallService { + // 2.1. create the component + c, err := reg.Create(config.Type) + if err != nil { + m.errInt(err, "create the component %s failed", name) + return err + } + //inject secret to component + if config.Metadata, err = m.Injector.InjectSecretRef(config.SecretRef, config.Metadata); err != nil { + return err + } + // 2.2. init + if err := c.Init(context.TODO(), &config); err != nil { + m.errInt(err, "init the component %s failed", name) + return err + } + m.phoneCallService[name] = c + } + return nil } func (m *MosnRuntime) initExtensionComponent(s services) error { + if err := m.initEmailService(s.email...); err != nil { + return err + } + + if err := m.initPhoneCallService(s.phone...); err != nil { + return err + } + return nil } diff --git a/pkg/runtime/config_generated.go b/pkg/runtime/config_generated.go index 00b1894918..8cff33941f 100644 --- a/pkg/runtime/config_generated.go +++ b/pkg/runtime/config_generated.go @@ -1,3 +1,5 @@ +// Code generated by github.com/seeflood/protoc-gen-p6 . + // Copyright 2021 Layotto Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -13,5 +15,17 @@ package runtime +import ( + email "mosn.io/layotto/components/email" + phone "mosn.io/layotto/components/phone" +) + type ExtensionComponentConfig struct { + // "mosn.io/layotto/spec/proto/extension/v1/email" + // email. + EmailService map[string]email.Config `json:"email"` + + // "mosn.io/layotto/spec/proto/extension/v1/phone" + // phone. + PhoneCallService map[string]phone.Config `json:"phone"` } diff --git a/pkg/runtime/context_generated.go b/pkg/runtime/context_generated.go index 08c61611cc..2d6b797608 100644 --- a/pkg/runtime/context_generated.go +++ b/pkg/runtime/context_generated.go @@ -1,3 +1,5 @@ +// Code generated by github.com/seeflood/protoc-gen-p6 . + // Copyright 2021 Layotto Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -13,7 +15,9 @@ package runtime -import "mosn.io/layotto/pkg/grpc" +import ( + grpc "mosn.io/layotto/pkg/grpc" +) func newApplicationContext(m *MosnRuntime) *grpc.ApplicationContext { return &grpc.ApplicationContext{ @@ -31,5 +35,8 @@ func newApplicationContext(m *MosnRuntime) *grpc.ApplicationContext { SecretStores: m.secretStores, DynamicComponents: m.dynamicComponents, CustomComponent: m.customComponent, + EmailService: m.emailService, + + PhoneCallService: m.phoneCallService, } } diff --git a/pkg/runtime/options_generated.go b/pkg/runtime/options_generated.go index f7835a2cff..4070d4c1e1 100644 --- a/pkg/runtime/options_generated.go +++ b/pkg/runtime/options_generated.go @@ -1,4 +1,4 @@ -// Code generated by github.com/seeflood/protoc-gen-p6. +// Code generated by github.com/seeflood/protoc-gen-p6 . // Copyright 2021 Layotto Authors // Licensed under the Apache License, Version 2.0 (the "License"); @@ -16,14 +16,28 @@ package runtime import ( - s3ext "mosn.io/layotto/pkg/grpc/extension/s3" + email "mosn.io/layotto/components/email" + phone "mosn.io/layotto/components/phone" ) type extensionComponentFactorys struct { + // "mosn.io/layotto/spec/proto/extension/v1/email" + // email. + email []*email.Factory + + // "mosn.io/layotto/spec/proto/extension/v1/phone" + // phone. + phone []*phone.Factory +} + +func WithEmailServiceFactory(email ...*email.Factory) Option { + return func(o *runtimeOptions) { + o.services.email = append(o.services.email, email...) + } } -func WithExtensionGrpcAPI() Option { - return WithGrpcAPI( - s3ext.NewS3Server, - ) +func WithPhoneCallServiceFactory(phone ...*phone.Factory) Option { + return func(o *runtimeOptions) { + o.services.phone = append(o.services.phone, phone...) + } } diff --git a/sdk/go-sdk/client/client.go b/sdk/go-sdk/client/client.go index c7990f8592..b650053671 100644 --- a/sdk/go-sdk/client/client.go +++ b/sdk/go-sdk/client/client.go @@ -23,8 +23,6 @@ import ( "os" "sync" - "mosn.io/layotto/spec/proto/extension/v1/s3" - "github.com/pkg/errors" "google.golang.org/grpc" diff --git a/sdk/go-sdk/client/client_generated.go b/sdk/go-sdk/client/client_generated.go index 6c061cdd48..0524c93e04 100644 --- a/sdk/go-sdk/client/client_generated.go +++ b/sdk/go-sdk/client/client_generated.go @@ -1,34 +1,45 @@ -/* - * Copyright 2021 Layotto Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ +// Code generated by github.com/seeflood/protoc-gen-p6 . + +// Copyright 2021 Layotto Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. package client import ( - "google.golang.org/grpc" + context "context" - v1 "mosn.io/layotto/spec/proto/runtime/v1" + grpc "google.golang.org/grpc" - "mosn.io/layotto/spec/proto/extension/v1/s3" + email "mosn.io/layotto/spec/proto/extension/v1/email" + phone "mosn.io/layotto/spec/proto/extension/v1/phone" + s3 "mosn.io/layotto/spec/proto/extension/v1/s3" + v1 "mosn.io/layotto/spec/proto/runtime/v1" ) +// Reference imports to suppress errors if they are not otherwise used. +var _ context.Context + // Client is the interface for runtime client implementation. type Client interface { runtimeAPI s3.ObjectStorageServiceClient + + // "mosn.io/layotto/spec/proto/extension/v1/email" + email.EmailServiceClient + + // "mosn.io/layotto/spec/proto/extension/v1/phone" + phone.PhoneCallServiceClient } // NewClientWithConnection instantiates runtime client using specific connection. @@ -37,6 +48,11 @@ func NewClientWithConnection(conn *grpc.ClientConn) Client { connection: conn, protoClient: v1.NewRuntimeClient(conn), ObjectStorageServiceClient: s3.NewObjectStorageServiceClient(conn), + // "mosn.io/layotto/spec/proto/extension/v1/email" + EmailServiceClient: email.NewEmailServiceClient(conn), + + // "mosn.io/layotto/spec/proto/extension/v1/phone" + PhoneCallServiceClient: phone.NewPhoneCallServiceClient(conn), } } @@ -45,4 +61,8 @@ type GRPCClient struct { connection *grpc.ClientConn protoClient v1.RuntimeClient s3.ObjectStorageServiceClient + // "mosn.io/layotto/spec/proto/extension/v1/email" + email.EmailServiceClient + // "mosn.io/layotto/spec/proto/extension/v1/phone" + phone.PhoneCallServiceClient } diff --git a/spec/proto/extension/v1/s3/oss.pb.go b/spec/proto/extension/v1/s3/oss.pb.go index b37c66a7ee..c73c2abeb7 100644 --- a/spec/proto/extension/v1/s3/oss.pb.go +++ b/spec/proto/extension/v1/s3/oss.pb.go @@ -8541,7 +8541,10 @@ var file_oss_proto_rawDesc = []byte{ 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x00, 0x42, - 0x2f, 0x5a, 0x2d, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x69, 0x6f, 0x2f, 0x6c, 0x61, 0x79, 0x6f, 0x74, + 0x5f, 0x0a, 0x1a, 0x73, 0x70, 0x65, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x65, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x33, 0x42, 0x12, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x74, + 0x6f, 0x5a, 0x2d, 0x6d, 0x6f, 0x73, 0x6e, 0x2e, 0x69, 0x6f, 0x2f, 0x6c, 0x61, 0x79, 0x6f, 0x74, 0x74, 0x6f, 0x2f, 0x73, 0x70, 0x65, 0x63, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x33, 0x3b, 0x73, 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, diff --git a/spec/proto/runtime/v1/lifecycle.pb.go b/spec/proto/runtime/v1/lifecycle.pb.go index c27533794e..86dfb9e917 100644 --- a/spec/proto/runtime/v1/lifecycle.pb.go +++ b/spec/proto/runtime/v1/lifecycle.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.0 +// protoc-gen-go v1.28.1 // protoc v3.17.3 // source: lifecycle.proto From 1d2be8a771b5bd86e65878bf0d2c1f25dd4ae443 Mon Sep 17 00:00:00 2001 From: wlwilliamx Date: Sat, 17 Sep 2022 21:08:14 +0800 Subject: [PATCH 07/19] fix(typo): fix a typo --- components/oss/aws/oss_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/oss/aws/oss_test.go b/components/oss/aws/oss_test.go index 78d893e65f..07cb9a21a4 100644 --- a/components/oss/aws/oss_test.go +++ b/components/oss/aws/oss_test.go @@ -152,7 +152,7 @@ func TestDeepCopy(t *testing.T) { VersionId: &value, } tovalue := &oss.ObjectVersion{} - err := copier.CopyWithOption(tovalue, fromValue, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{time2int64}}) + err := copier.CopyWithOption(tovalue, fromValue, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{oss.TimeToInt64}}) assert.Nil(t, err) assert.Equal(t, tovalue.Owner.DisplayName, value) } From 24356a5febbf9c1171634848311c06da3ef87a19 Mon Sep 17 00:00:00 2001 From: wlwilliamx Date: Thu, 22 Sep 2022 20:33:30 +0800 Subject: [PATCH 08/19] fix(typo): fix a typo --- components/oss/ceph/oss.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/oss/ceph/oss.go b/components/oss/ceph/oss.go index fdec8fc6a8..27939e2d19 100644 --- a/components/oss/ceph/oss.go +++ b/components/oss/ceph/oss.go @@ -626,7 +626,7 @@ func (c *CephOSS) SignURL(ctx context.Context, req *oss.SignURLInput) (*oss.Sign } func (c *CephOSS) RestoreObject(ctx context.Context, req *oss.RestoreObjectInput) (*oss.RestoreObjectOutput, error) { - return nil, errors.New("RestoreObject method not supported on AWS") + return nil, errors.New("RestoreObject method not supported on CEPH") } func (c *CephOSS) UpdateDownloadBandwidthRateLimit(ctx context.Context, req *oss.UpdateBandwidthRateLimitInput) error { @@ -637,7 +637,7 @@ func (c *CephOSS) UpdateUploadBandwidthRateLimit(ctx context.Context, req *oss.U return errors.New("UpdateUploadBandwidthRateLimit method not supported now") } func (c *CephOSS) AppendObject(ctx context.Context, req *oss.AppendObjectInput) (*oss.AppendObjectOutput, error) { - return nil, errors.New("AppendObject method not supported on AWS") + return nil, errors.New("AppendObject method not supported on CEPH") } func (c *CephOSS) getClient() (*s3.Client, error) { From 7b3d8f5e57d2361419ccbab333944f93396abc0a Mon Sep 17 00:00:00 2001 From: wlwilliamx Date: Thu, 22 Sep 2022 20:42:08 +0800 Subject: [PATCH 09/19] fix(typo): fix a typo --- components/oss/ceph/oss_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/oss/ceph/oss_test.go b/components/oss/ceph/oss_test.go index 21240a872c..52f2536e68 100644 --- a/components/oss/ceph/oss_test.go +++ b/components/oss/ceph/oss_test.go @@ -51,7 +51,7 @@ func TestCephOss(t *testing.T) { assert.Nil(t, err) appendObjectResp, err := instance.AppendObject(context.TODO(), &oss.AppendObjectInput{}) - assert.Equal(t, errors.New("AppendObject method not supported on AWS"), err) + assert.Equal(t, errors.New("AppendObject method not supported on CEPH"), err) assert.Nil(t, appendObjectResp) _, err = instance.AbortMultipartUpload(context.TODO(), &oss.AbortMultipartUploadInput{}) From fd653b25a1cbcc9d467ccd0c4f99f87f2c632b7e Mon Sep 17 00:00:00 2001 From: wlwilliamx Date: Mon, 10 Oct 2022 16:51:42 +0800 Subject: [PATCH 10/19] test(oss): add some UT --- components/oss/aws/oss.go | 71 ++++----------------- components/oss/ceph/oss.go | 87 +++----------------------- components/oss/ceph/oss_test.go | 21 ++++++- components/oss/option.go | 105 ++++++++++++++++++++++++++++++++ 4 files changed, 144 insertions(+), 140 deletions(-) diff --git a/components/oss/aws/oss.go b/components/oss/aws/oss.go index 674122733b..40c6768e17 100644 --- a/components/oss/aws/oss.go +++ b/components/oss/aws/oss.go @@ -89,13 +89,8 @@ func (a *AwsOss) GetObject(ctx context.Context, req *oss.GetObjectInput) (*oss.G if err != nil { return nil, err } - out := &oss.GetObjectOutput{} - err = copier.Copy(out, ob) - if err != nil { - return nil, err - } - out.DataStream = ob.Body - return out, nil + + return oss.GetGetObjectOutput(ob) } func (a *AwsOss) PutObject(ctx context.Context, req *oss.PutObjectInput) (*oss.PutObjectOutput, error) { @@ -259,14 +254,8 @@ func (a *AwsOss) ListObjects(ctx context.Context, req *oss.ListObjectsInput) (*o if err != nil { return nil, err } - output := &oss.ListObjectsOutput{} - err = copier.CopyWithOption(output, resp, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{oss.TimeToInt64}}) - // if not return NextMarker, use the value of the last Key in the response as the marker - if output.IsTruncated && output.NextMarker == "" { - index := len(output.Contents) - 1 - output.NextMarker = output.Contents[index].Key - } - return output, err + + return oss.GetListObjectsOutput(resp) } func (a *AwsOss) GetObjectCannedAcl(ctx context.Context, req *oss.GetObjectCannedAclInput) (*oss.GetObjectCannedAclOutput, error) { return nil, errors.New("GetObjectCannedAcl method not supported on AWS") @@ -332,12 +321,8 @@ func (a *AwsOss) UploadPart(ctx context.Context, req *oss.UploadPartInput) (*oss if err != nil { return nil, err } - output := &oss.UploadPartOutput{} - err = copier.Copy(output, resp) - if err != nil { - return nil, err - } - return output, err + + return oss.GetUploadPartOutput(resp) } func (a *AwsOss) UploadPartCopy(ctx context.Context, req *oss.UploadPartCopyInput) (*oss.UploadPartCopyOutput, error) { client, err := a.getClient() @@ -357,12 +342,8 @@ func (a *AwsOss) UploadPartCopy(ctx context.Context, req *oss.UploadPartCopyInpu } input.CopySource = ©Source resp, err := client.UploadPartCopy(ctx, input) - if err != nil { - return nil, err - } - output := &oss.UploadPartCopyOutput{} - err = copier.Copy(output, resp) - return output, err + + return oss.GetUploadPartCopyOutput(resp) } func (a *AwsOss) CompleteMultipartUpload(ctx context.Context, req *oss.CompleteMultipartUploadInput) (*oss.CompleteMultipartUploadOutput, error) { client, err := a.getClient() @@ -417,20 +398,8 @@ func (a *AwsOss) ListMultipartUploads(ctx context.Context, req *oss.ListMultipar if err != nil { return nil, err } - output := &oss.ListMultipartUploadsOutput{CommonPrefixes: []string{}, Uploads: []*oss.MultipartUpload{}} - err = copier.Copy(output, resp) - if err != nil { - return nil, err - } - for _, v := range resp.CommonPrefixes { - output.CommonPrefixes = append(output.CommonPrefixes, *v.Prefix) - } - for _, v := range resp.Uploads { - upload := &oss.MultipartUpload{} - copier.CopyWithOption(upload, v, copier.Option{IgnoreEmpty: true, DeepCopy: true}) - output.Uploads = append(output.Uploads, upload) - } - return output, err + + return oss.GetListMultipartUploadsOutput(resp) } func (a *AwsOss) ListObjectVersions(ctx context.Context, req *oss.ListObjectVersionsInput) (*oss.ListObjectVersionsOutput, error) { client, err := a.getClient() @@ -446,24 +415,8 @@ func (a *AwsOss) ListObjectVersions(ctx context.Context, req *oss.ListObjectVers if err != nil { return nil, err } - output := &oss.ListObjectVersionsOutput{} - err = copier.Copy(output, resp) - if err != nil { - return nil, err - } - for _, v := range resp.CommonPrefixes { - output.CommonPrefixes = append(output.CommonPrefixes, *v.Prefix) - } - for _, v := range resp.DeleteMarkers { - entry := &oss.DeleteMarkerEntry{IsLatest: v.IsLatest, Key: *v.Key, Owner: &oss.Owner{DisplayName: *v.Owner.DisplayName, ID: *v.Owner.ID}, VersionId: *v.VersionId} - output.DeleteMarkers = append(output.DeleteMarkers, entry) - } - for _, v := range resp.Versions { - version := &oss.ObjectVersion{} - copier.CopyWithOption(version, v, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{oss.TimeToInt64}}) - output.Versions = append(output.Versions, version) - } - return output, err + + return oss.GetListObjectVersionsOutput(resp) } func (a *AwsOss) HeadObject(ctx context.Context, req *oss.HeadObjectInput) (*oss.HeadObjectOutput, error) { diff --git a/components/oss/ceph/oss.go b/components/oss/ceph/oss.go index 27939e2d19..2f84d54950 100644 --- a/components/oss/ceph/oss.go +++ b/components/oss/ceph/oss.go @@ -17,7 +17,6 @@ package ceph import ( - "bytes" "context" "encoding/json" "errors" @@ -98,13 +97,7 @@ func (c *CephOSS) GetObject(ctx context.Context, req *oss.GetObjectInput) (*oss. return nil, err } - out := &oss.GetObjectOutput{} - err = copier.Copy(out, ob) - if err != nil { - return nil, err - } - out.DataStream = ob.Body - return out, nil + return oss.GetGetObjectOutput(ob) } func (c *CephOSS) PutObject(ctx context.Context, req *oss.PutObjectInput) (*oss.PutObjectOutput, error) { @@ -300,14 +293,7 @@ func (c *CephOSS) ListObjects(ctx context.Context, req *oss.ListObjectsInput) (* return nil, err } - output := &oss.ListObjectsOutput{} - err = copier.CopyWithOption(output, resp, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{oss.TimeToInt64}}) - // if not return NextMarker, use the value of the last Key in the response as the marker - if output.IsTruncated && output.NextMarker == "" { - index := len(output.Contents) - 1 - output.NextMarker = output.Contents[index].Key - } - return output, err + return oss.GetListObjectsOutput(resp) } func (c *CephOSS) GetObjectCannedAcl(ctx context.Context, req *oss.GetObjectCannedAclInput) (*oss.GetObjectCannedAclOutput, error) { @@ -326,19 +312,7 @@ func (c *CephOSS) GetObjectCannedAcl(ctx context.Context, req *oss.GetObjectCann return nil, err } - out := &oss.GetObjectCannedAclOutput{} - err = copier.CopyWithOption(out, resp, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{}}) - if err != nil { - return nil, err - } - bs, _ := json.Marshal(resp.Grants) - var bf bytes.Buffer - err = json.Indent(&bf, bs, "", "\t") - if err != nil { - return nil, err - } - out.CannedAcl = bf.String() - return out, nil + return oss.GetGetObjectCannedAclOutput(resp) } func (c *CephOSS) PutObjectCannedAcl(ctx context.Context, req *oss.PutObjectCannedAclInput) (*oss.PutObjectCannedAclOutput, error) { @@ -393,12 +367,7 @@ func (c *CephOSS) UploadPart(ctx context.Context, req *oss.UploadPartInput) (*os return nil, err } - output := &oss.UploadPartOutput{} - err = copier.Copy(output, resp) - if err != nil { - return nil, err - } - return output, err + return oss.GetUploadPartOutput(resp) } func (c *CephOSS) UploadPartCopy(ctx context.Context, req *oss.UploadPartCopyInput) (*oss.UploadPartCopyOutput, error) { @@ -422,12 +391,7 @@ func (c *CephOSS) UploadPartCopy(ctx context.Context, req *oss.UploadPartCopyInp return nil, err } - out := &oss.UploadPartCopyOutput{} - err = copier.CopyWithOption(out, resp, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{}}) - if err != nil { - return nil, err - } - return out, err + return oss.GetUploadPartCopyOutput(resp) } func (c *CephOSS) CompleteMultipartUpload(ctx context.Context, req *oss.CompleteMultipartUploadInput) (*oss.CompleteMultipartUploadOutput, error) { @@ -489,12 +453,7 @@ func (c *CephOSS) ListParts(ctx context.Context, req *oss.ListPartsInput) (*oss. return nil, err } - output := &oss.ListPartsOutput{} - err = copier.CopyWithOption(output, resp, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{}}) - if err != nil { - return nil, err - } - return output, err + return oss.GetListPartsOutput(resp) } func (c *CephOSS) ListMultipartUploads(ctx context.Context, req *oss.ListMultipartUploadsInput) (*oss.ListMultipartUploadsOutput, error) { @@ -513,20 +472,7 @@ func (c *CephOSS) ListMultipartUploads(ctx context.Context, req *oss.ListMultipa return nil, err } - output := &oss.ListMultipartUploadsOutput{CommonPrefixes: []string{}, Uploads: []*oss.MultipartUpload{}} - err = copier.Copy(output, resp) - if err != nil { - return nil, err - } - for _, v := range resp.CommonPrefixes { - output.CommonPrefixes = append(output.CommonPrefixes, *v.Prefix) - } - for _, v := range resp.Uploads { - upload := &oss.MultipartUpload{} - copier.CopyWithOption(upload, v, copier.Option{IgnoreEmpty: true, DeepCopy: true}) - output.Uploads = append(output.Uploads, upload) - } - return output, err + return oss.GetListMultipartUploadsOutput(resp) } func (c *CephOSS) ListObjectVersions(ctx context.Context, req *oss.ListObjectVersionsInput) (*oss.ListObjectVersionsOutput, error) { @@ -545,24 +491,7 @@ func (c *CephOSS) ListObjectVersions(ctx context.Context, req *oss.ListObjectVer return nil, err } - output := &oss.ListObjectVersionsOutput{} - err = copier.Copy(output, resp) - if err != nil { - return nil, err - } - for _, v := range resp.CommonPrefixes { - output.CommonPrefixes = append(output.CommonPrefixes, *v.Prefix) - } - for _, v := range resp.DeleteMarkers { - entry := &oss.DeleteMarkerEntry{IsLatest: v.IsLatest, Key: *v.Key, Owner: &oss.Owner{DisplayName: *v.Owner.DisplayName, ID: *v.Owner.ID}, VersionId: *v.VersionId} - output.DeleteMarkers = append(output.DeleteMarkers, entry) - } - for _, v := range resp.Versions { - version := &oss.ObjectVersion{} - copier.CopyWithOption(version, v, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{oss.TimeToInt64}}) - output.Versions = append(output.Versions, version) - } - return output, err + return oss.GetListObjectVersionsOutput(resp) } func (c *CephOSS) HeadObject(ctx context.Context, req *oss.HeadObjectInput) (*oss.HeadObjectOutput, error) { diff --git a/components/oss/ceph/oss_test.go b/components/oss/ceph/oss_test.go index 52f2536e68..0781ec7b69 100644 --- a/components/oss/ceph/oss_test.go +++ b/components/oss/ceph/oss_test.go @@ -20,10 +20,10 @@ import ( "context" "encoding/json" "errors" - "testing" - + "github.com/aws/aws-sdk-go-v2/service/s3" "github.com/stretchr/testify/assert" "mosn.io/pkg/buffer" + "testing" "mosn.io/layotto/components/oss" ) @@ -129,4 +129,21 @@ func TestCephOss(t *testing.T) { err = instance.UpdateUploadBandwidthRateLimit(context.TODO(), &oss.UpdateBandwidthRateLimitInput{}) assert.NotNil(t, err) + + _, err = oss.GetGetObjectOutput(&s3.GetObjectOutput{}) + assert.Nil(t, err) + _, err = oss.GetListObjectsOutput(&s3.ListObjectsOutput{}) + assert.Nil(t, err) + _, err = oss.GetGetObjectCannedAclOutput(&s3.GetObjectAclOutput{}) + assert.Nil(t, err) + _, err = oss.GetUploadPartOutput(&s3.UploadPartOutput{}) + assert.Nil(t, err) + _, err = oss.GetUploadPartCopyOutput(&s3.UploadPartCopyOutput{}) + assert.Nil(t, err) + _, err = oss.GetListPartsOutput(&s3.ListPartsOutput{}) + assert.Nil(t, err) + _, err = oss.GetListMultipartUploadsOutput(&s3.ListMultipartUploadsOutput{}) + assert.Nil(t, err) + _, err = oss.GetListObjectVersionsOutput(&s3.ListObjectVersionsOutput{}) + assert.Nil(t, err) } diff --git a/components/oss/option.go b/components/oss/option.go index 7511451365..019e8191e9 100644 --- a/components/oss/option.go +++ b/components/oss/option.go @@ -17,6 +17,9 @@ package oss import ( + "bytes" + "encoding/json" + "github.com/aws/aws-sdk-go-v2/service/s3" "time" "github.com/jinzhu/copier" @@ -41,3 +44,105 @@ var ( }, } ) + +func GetGetObjectOutput(ob *s3.GetObjectOutput) (*GetObjectOutput, error) { + out := &GetObjectOutput{} + err := copier.Copy(out, ob) + if err != nil { + return nil, err + } + out.DataStream = ob.Body + return out, nil +} + +func GetListObjectsOutput(resp *s3.ListObjectsOutput) (*ListObjectsOutput, error) { + output := &ListObjectsOutput{} + err := copier.CopyWithOption(output, resp, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{TimeToInt64}}) + // if not return NextMarker, use the value of the last Key in the response as the marker + if output.IsTruncated && output.NextMarker == "" { + index := len(output.Contents) - 1 + output.NextMarker = output.Contents[index].Key + } + return output, err +} + +func GetGetObjectCannedAclOutput(resp *s3.GetObjectAclOutput) (*GetObjectCannedAclOutput, error) { + out := &GetObjectCannedAclOutput{} + err := copier.CopyWithOption(out, resp, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{}}) + if err != nil { + return nil, err + } + bs, _ := json.Marshal(resp.Grants) + var bf bytes.Buffer + err = json.Indent(&bf, bs, "", "\t") + if err != nil { + return nil, err + } + out.CannedAcl = bf.String() + return out, nil +} + +func GetUploadPartOutput(resp *s3.UploadPartOutput) (*UploadPartOutput, error) { + output := &UploadPartOutput{} + err := copier.Copy(output, resp) + if err != nil { + return nil, err + } + return output, err +} + +func GetUploadPartCopyOutput(resp *s3.UploadPartCopyOutput) (*UploadPartCopyOutput, error) { + out := &UploadPartCopyOutput{} + err := copier.CopyWithOption(out, resp, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{}}) + if err != nil { + return nil, err + } + return out, err +} + +func GetListPartsOutput(resp *s3.ListPartsOutput) (*ListPartsOutput, error) { + output := &ListPartsOutput{} + err := copier.CopyWithOption(output, resp, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{}}) + if err != nil { + return nil, err + } + return output, err +} + +func GetListMultipartUploadsOutput(resp *s3.ListMultipartUploadsOutput) (*ListMultipartUploadsOutput, error) { + output := &ListMultipartUploadsOutput{CommonPrefixes: []string{}, Uploads: []*MultipartUpload{}} + err := copier.Copy(output, resp) + if err != nil { + return nil, err + } + for _, v := range resp.CommonPrefixes { + output.CommonPrefixes = append(output.CommonPrefixes, *v.Prefix) + } + for _, v := range resp.Uploads { + upload := &MultipartUpload{} + copier.CopyWithOption(upload, v, copier.Option{IgnoreEmpty: true, DeepCopy: true}) + output.Uploads = append(output.Uploads, upload) + } + return output, err +} + +func GetListObjectVersionsOutput(resp *s3.ListObjectVersionsOutput) (*ListObjectVersionsOutput, error) { + output := &ListObjectVersionsOutput{} + err := copier.Copy(output, resp) + if err != nil { + return nil, err + } + for _, v := range resp.CommonPrefixes { + output.CommonPrefixes = append(output.CommonPrefixes, *v.Prefix) + } + for _, v := range resp.DeleteMarkers { + entry := &DeleteMarkerEntry{IsLatest: v.IsLatest, Key: *v.Key, Owner: &Owner{DisplayName: *v.Owner.DisplayName, ID: *v.Owner.ID}, VersionId: *v.VersionId} + output.DeleteMarkers = append(output.DeleteMarkers, entry) + } + for _, v := range resp.Versions { + version := &ObjectVersion{} + copier.CopyWithOption(version, v, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{TimeToInt64}}) + output.Versions = append(output.Versions, version) + } + return output, err +} From f7b8e60a7082732e16ae5589685ca1d9acfa9e4a Mon Sep 17 00:00:00 2001 From: wlwilliamx Date: Mon, 10 Oct 2022 17:23:37 +0800 Subject: [PATCH 11/19] fix(typo): fix a typo --- components/oss/aws/oss.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/components/oss/aws/oss.go b/components/oss/aws/oss.go index 40c6768e17..16c25d8fba 100644 --- a/components/oss/aws/oss.go +++ b/components/oss/aws/oss.go @@ -342,6 +342,9 @@ func (a *AwsOss) UploadPartCopy(ctx context.Context, req *oss.UploadPartCopyInpu } input.CopySource = ©Source resp, err := client.UploadPartCopy(ctx, input) + if err != nil { + return nil, err + } return oss.GetUploadPartCopyOutput(resp) } From ef7f46958c64b58d637152720d251d17c77837e1 Mon Sep 17 00:00:00 2001 From: wlwilliamx Date: Thu, 13 Oct 2022 10:34:36 +0800 Subject: [PATCH 12/19] chore(goimports): goimports --- components/oss/option.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/components/oss/option.go b/components/oss/option.go index 019e8191e9..66a1561632 100644 --- a/components/oss/option.go +++ b/components/oss/option.go @@ -19,9 +19,10 @@ package oss import ( "bytes" "encoding/json" - "github.com/aws/aws-sdk-go-v2/service/s3" "time" + "github.com/aws/aws-sdk-go-v2/service/s3" + "github.com/jinzhu/copier" ) From e3c9ac304a37aa5e19014949448fbe7ead45f6bc Mon Sep 17 00:00:00 2001 From: wlwilliamx Date: Thu, 13 Oct 2022 10:44:10 +0800 Subject: [PATCH 13/19] chore(goimports): goimports --- components/oss/ceph/oss_test.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/components/oss/ceph/oss_test.go b/components/oss/ceph/oss_test.go index 0781ec7b69..5f718f9c89 100644 --- a/components/oss/ceph/oss_test.go +++ b/components/oss/ceph/oss_test.go @@ -20,10 +20,11 @@ import ( "context" "encoding/json" "errors" + "testing" + "github.com/aws/aws-sdk-go-v2/service/s3" "github.com/stretchr/testify/assert" "mosn.io/pkg/buffer" - "testing" "mosn.io/layotto/components/oss" ) From 6537c0bd258b47dbb10e51b0fe76c6ad327ba9cc Mon Sep 17 00:00:00 2001 From: wlwilliamx Date: Thu, 13 Oct 2022 11:10:50 +0800 Subject: [PATCH 14/19] test(oss): add some UT --- components/oss/aws/oss_test.go | 19 +++++++++++++++++++ components/oss/option_test.go | 20 ++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/components/oss/aws/oss_test.go b/components/oss/aws/oss_test.go index 07cb9a21a4..5104dbe308 100644 --- a/components/oss/aws/oss_test.go +++ b/components/oss/aws/oss_test.go @@ -23,6 +23,8 @@ import ( "testing" "time" + "github.com/aws/aws-sdk-go-v2/service/s3" + "github.com/jinzhu/copier" "github.com/aws/aws-sdk-go-v2/service/s3/types" @@ -136,6 +138,23 @@ func TestAwsOss(t *testing.T) { err = instance.UpdateUploadBandwidthRateLimit(context.TODO(), &oss.UpdateBandwidthRateLimitInput{}) assert.NotNil(t, err) + + _, err = oss.GetGetObjectOutput(&s3.GetObjectOutput{}) + assert.Nil(t, err) + _, err = oss.GetListObjectsOutput(&s3.ListObjectsOutput{}) + assert.Nil(t, err) + _, err = oss.GetGetObjectCannedAclOutput(&s3.GetObjectAclOutput{}) + assert.Nil(t, err) + _, err = oss.GetUploadPartOutput(&s3.UploadPartOutput{}) + assert.Nil(t, err) + _, err = oss.GetUploadPartCopyOutput(&s3.UploadPartCopyOutput{}) + assert.Nil(t, err) + _, err = oss.GetListPartsOutput(&s3.ListPartsOutput{}) + assert.Nil(t, err) + _, err = oss.GetListMultipartUploadsOutput(&s3.ListMultipartUploadsOutput{}) + assert.Nil(t, err) + _, err = oss.GetListObjectVersionsOutput(&s3.ListObjectVersionsOutput{}) + assert.Nil(t, err) } func TestDeepCopy(t *testing.T) { diff --git a/components/oss/option_test.go b/components/oss/option_test.go index e05950517d..e6afbc1986 100644 --- a/components/oss/option_test.go +++ b/components/oss/option_test.go @@ -17,6 +17,7 @@ package oss import ( + "github.com/aws/aws-sdk-go-v2/service/s3" "testing" "time" @@ -50,3 +51,22 @@ func TestCopierOption(t *testing.T) { assert.Nil(t, err) assert.Equal(t, ti.Unix(), dst.TestInt64toTime) } + +func TestGetOutput(t *testing.T) { + _, err := GetGetObjectOutput(&s3.GetObjectOutput{}) + assert.Nil(t, err) + _, err = GetListObjectsOutput(&s3.ListObjectsOutput{}) + assert.Nil(t, err) + _, err = GetGetObjectCannedAclOutput(&s3.GetObjectAclOutput{}) + assert.Nil(t, err) + _, err = GetUploadPartOutput(&s3.UploadPartOutput{}) + assert.Nil(t, err) + _, err = GetUploadPartCopyOutput(&s3.UploadPartCopyOutput{}) + assert.Nil(t, err) + _, err = GetListPartsOutput(&s3.ListPartsOutput{}) + assert.Nil(t, err) + _, err = GetListMultipartUploadsOutput(&s3.ListMultipartUploadsOutput{}) + assert.Nil(t, err) + _, err = GetListObjectVersionsOutput(&s3.ListObjectVersionsOutput{}) + assert.Nil(t, err) +} From 98581ed57019f3039fe9fd5ca0c7634c8b64cbd1 Mon Sep 17 00:00:00 2001 From: wlwilliamx Date: Thu, 13 Oct 2022 11:12:33 +0800 Subject: [PATCH 15/19] chore(goimports): goimports file --- components/oss/option_test.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/components/oss/option_test.go b/components/oss/option_test.go index e6afbc1986..c0e01efcc8 100644 --- a/components/oss/option_test.go +++ b/components/oss/option_test.go @@ -17,10 +17,11 @@ package oss import ( - "github.com/aws/aws-sdk-go-v2/service/s3" "testing" "time" + "github.com/aws/aws-sdk-go-v2/service/s3" + "github.com/stretchr/testify/assert" "github.com/jinzhu/copier" From 754058fd8383b10ba6051b55ca25a93df7a7f9f0 Mon Sep 17 00:00:00 2001 From: wlwilliamx Date: Thu, 13 Oct 2022 16:12:42 +0800 Subject: [PATCH 16/19] chore(oss): extract output functions and add UT for these functions --- components/oss/aws/oss.go | 18 ++++---------- components/oss/aws/oss_test.go | 10 ++++++++ components/oss/ceph/oss.go | 32 ++++-------------------- components/oss/ceph/oss_test.go | 12 +++++++++ components/oss/option.go | 44 +++++++++++++++++++++++++++++++++ components/oss/option_test.go | 12 +++++++++ 6 files changed, 88 insertions(+), 40 deletions(-) diff --git a/components/oss/aws/oss.go b/components/oss/aws/oss.go index 16c25d8fba..29fc1dd6d8 100644 --- a/components/oss/aws/oss.go +++ b/components/oss/aws/oss.go @@ -109,12 +109,8 @@ func (a *AwsOss) PutObject(ctx context.Context, req *oss.PutObjectInput) (*oss.P if err != nil { return nil, err } - out := &oss.PutObjectOutput{} - err = copier.Copy(out, resp) - if err != nil { - return nil, err - } - return out, err + + return oss.GetPutObjectOutput(resp) } func (a *AwsOss) DeleteObject(ctx context.Context, req *oss.DeleteObjectInput) (*oss.DeleteObjectOutput, error) { @@ -130,7 +126,7 @@ func (a *AwsOss) DeleteObject(ctx context.Context, req *oss.DeleteObjectInput) ( if err != nil { return nil, err } - return &oss.DeleteObjectOutput{DeleteMarker: resp.DeleteMarker, RequestCharged: string(resp.RequestCharged), VersionId: *resp.VersionId}, err + return oss.GetDeleteObjectOutput(resp) } func (a *AwsOss) PutObjectTagging(ctx context.Context, req *oss.PutObjectTaggingInput) (*oss.PutObjectTaggingOutput, error) { @@ -164,7 +160,7 @@ func (a *AwsOss) DeleteObjectTagging(ctx context.Context, req *oss.DeleteObjectT if err != nil { return nil, err } - return &oss.DeleteObjectTaggingOutput{VersionId: *resp.VersionId}, err + return oss.GetDeleteObjectTaggingOutput(resp) } func (a *AwsOss) GetObjectTagging(ctx context.Context, req *oss.GetObjectTaggingInput) (*oss.GetObjectTaggingOutput, error) { @@ -182,11 +178,7 @@ func (a *AwsOss) GetObjectTagging(ctx context.Context, req *oss.GetObjectTagging return nil, err } - output := &oss.GetObjectTaggingOutput{Tags: map[string]string{}} - for _, tags := range resp.TagSet { - output.Tags[*tags.Key] = *tags.Value - } - return output, err + return oss.GetGetObjectTaggingOutput(resp) } func (a *AwsOss) CopyObject(ctx context.Context, req *oss.CopyObjectInput) (*oss.CopyObjectOutput, error) { diff --git a/components/oss/aws/oss_test.go b/components/oss/aws/oss_test.go index 5104dbe308..8773a11d4b 100644 --- a/components/oss/aws/oss_test.go +++ b/components/oss/aws/oss_test.go @@ -23,6 +23,8 @@ import ( "testing" "time" + "github.com/aws/aws-sdk-go-v2/feature/s3/manager" + "github.com/aws/aws-sdk-go-v2/service/s3" "github.com/jinzhu/copier" @@ -141,6 +143,14 @@ func TestAwsOss(t *testing.T) { _, err = oss.GetGetObjectOutput(&s3.GetObjectOutput{}) assert.Nil(t, err) + _, err = oss.GetPutObjectOutput(&manager.UploadOutput{}) + assert.Nil(t, err) + _, err = oss.GetDeleteObjectOutput(&s3.DeleteObjectOutput{}) + assert.Nil(t, err) + _, err = oss.GetDeleteObjectOutput(&s3.DeleteObjectOutput{}) + assert.Nil(t, err) + _, err = oss.GetGetObjectTaggingOutput(&s3.GetObjectTaggingOutput{}) + assert.Nil(t, err) _, err = oss.GetListObjectsOutput(&s3.ListObjectsOutput{}) assert.Nil(t, err) _, err = oss.GetGetObjectCannedAclOutput(&s3.GetObjectAclOutput{}) diff --git a/components/oss/ceph/oss.go b/components/oss/ceph/oss.go index 2f84d54950..561d6c320d 100644 --- a/components/oss/ceph/oss.go +++ b/components/oss/ceph/oss.go @@ -118,12 +118,7 @@ func (c *CephOSS) PutObject(ctx context.Context, req *oss.PutObjectInput) (*oss. return nil, err } - out := &oss.PutObjectOutput{} - err = copier.Copy(out, resp) - if err != nil { - return nil, err - } - return out, err + return oss.GetPutObjectOutput(resp) } func (c *CephOSS) DeleteObject(ctx context.Context, req *oss.DeleteObjectInput) (*oss.DeleteObjectOutput, error) { @@ -141,11 +136,7 @@ func (c *CephOSS) DeleteObject(ctx context.Context, req *oss.DeleteObjectInput) return nil, err } - versionId := "" - if resp.VersionId != nil { - versionId = *resp.VersionId - } - return &oss.DeleteObjectOutput{DeleteMarker: resp.DeleteMarker, RequestCharged: string(resp.RequestCharged), VersionId: versionId}, err + return oss.GetDeleteObjectOutput(resp) } func (c *CephOSS) PutObjectTagging(ctx context.Context, req *oss.PutObjectTaggingInput) (*oss.PutObjectTaggingOutput, error) { @@ -184,11 +175,7 @@ func (c *CephOSS) DeleteObjectTagging(ctx context.Context, req *oss.DeleteObject return nil, err } - versionId := "" - if resp.VersionId != nil { - versionId = *resp.VersionId - } - return &oss.DeleteObjectTaggingOutput{VersionId: versionId}, err + return oss.GetDeleteObjectTaggingOutput(resp) } func (c *CephOSS) GetObjectTagging(ctx context.Context, req *oss.GetObjectTaggingInput) (*oss.GetObjectTaggingOutput, error) { @@ -207,11 +194,7 @@ func (c *CephOSS) GetObjectTagging(ctx context.Context, req *oss.GetObjectTaggin return nil, err } - output := &oss.GetObjectTaggingOutput{Tags: map[string]string{}} - for _, tags := range resp.TagSet { - output.Tags[*tags.Key] = *tags.Value - } - return output, err + return oss.GetGetObjectTaggingOutput(resp) } func (c *CephOSS) CopyObject(ctx context.Context, req *oss.CopyObjectInput) (*oss.CopyObjectOutput, error) { @@ -239,12 +222,7 @@ func (c *CephOSS) CopyObject(ctx context.Context, req *oss.CopyObjectInput) (*os return nil, err } - out := &oss.CopyObjectOutput{} - err = copier.CopyWithOption(out, resp, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{}}) - if err != nil { - return nil, err - } - return out, err + return oss.GetCopyObjectOutput(resp) } func (c *CephOSS) DeleteObjects(ctx context.Context, req *oss.DeleteObjectsInput) (*oss.DeleteObjectsOutput, error) { diff --git a/components/oss/ceph/oss_test.go b/components/oss/ceph/oss_test.go index 5f718f9c89..9154099658 100644 --- a/components/oss/ceph/oss_test.go +++ b/components/oss/ceph/oss_test.go @@ -22,6 +22,8 @@ import ( "errors" "testing" + "github.com/aws/aws-sdk-go-v2/feature/s3/manager" + "github.com/aws/aws-sdk-go-v2/service/s3" "github.com/stretchr/testify/assert" "mosn.io/pkg/buffer" @@ -133,6 +135,16 @@ func TestCephOss(t *testing.T) { _, err = oss.GetGetObjectOutput(&s3.GetObjectOutput{}) assert.Nil(t, err) + _, err = oss.GetPutObjectOutput(&manager.UploadOutput{}) + assert.Nil(t, err) + _, err = oss.GetDeleteObjectOutput(&s3.DeleteObjectOutput{}) + assert.Nil(t, err) + _, err = oss.GetDeleteObjectOutput(&s3.DeleteObjectOutput{}) + assert.Nil(t, err) + _, err = oss.GetGetObjectTaggingOutput(&s3.GetObjectTaggingOutput{}) + assert.Nil(t, err) + _, err = oss.GetCopyObjectOutput(&s3.CopyObjectOutput{}) + assert.Nil(t, err) _, err = oss.GetListObjectsOutput(&s3.ListObjectsOutput{}) assert.Nil(t, err) _, err = oss.GetGetObjectCannedAclOutput(&s3.GetObjectAclOutput{}) diff --git a/components/oss/option.go b/components/oss/option.go index 66a1561632..dadafde6e6 100644 --- a/components/oss/option.go +++ b/components/oss/option.go @@ -21,6 +21,8 @@ import ( "encoding/json" "time" + "github.com/aws/aws-sdk-go-v2/feature/s3/manager" + "github.com/aws/aws-sdk-go-v2/service/s3" "github.com/jinzhu/copier" @@ -56,6 +58,48 @@ func GetGetObjectOutput(ob *s3.GetObjectOutput) (*GetObjectOutput, error) { return out, nil } +func GetPutObjectOutput(resp *manager.UploadOutput) (*PutObjectOutput, error) { + out := &PutObjectOutput{} + err := copier.Copy(out, resp) + if err != nil { + return nil, err + } + return out, err +} + +func GetDeleteObjectOutput(resp *s3.DeleteObjectOutput) (*DeleteObjectOutput, error) { + versionId := "" + if resp.VersionId != nil { + versionId = *resp.VersionId + } + return &DeleteObjectOutput{DeleteMarker: resp.DeleteMarker, RequestCharged: string(resp.RequestCharged), VersionId: versionId}, nil +} + +func GetDeleteObjectTaggingOutput(resp *s3.DeleteObjectTaggingOutput) (*DeleteObjectTaggingOutput, error) { + versionId := "" + if resp.VersionId != nil { + versionId = *resp.VersionId + } + return &DeleteObjectTaggingOutput{VersionId: versionId}, nil +} + +func GetGetObjectTaggingOutput(resp *s3.GetObjectTaggingOutput) (*GetObjectTaggingOutput, error) { + output := &GetObjectTaggingOutput{Tags: map[string]string{}} + for _, tags := range resp.TagSet { + output.Tags[*tags.Key] = *tags.Value + } + return output, nil +} + +func GetCopyObjectOutput(resp *s3.CopyObjectOutput) (*CopyObjectOutput, error) { + out := &CopyObjectOutput{} + err := copier.CopyWithOption(out, resp, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{}}) + if err != nil { + return nil, err + } + return out, nil +} + func GetListObjectsOutput(resp *s3.ListObjectsOutput) (*ListObjectsOutput, error) { output := &ListObjectsOutput{} err := copier.CopyWithOption(output, resp, copier.Option{IgnoreEmpty: true, DeepCopy: true, Converters: []copier.TypeConverter{TimeToInt64}}) diff --git a/components/oss/option_test.go b/components/oss/option_test.go index c0e01efcc8..fc50b159a5 100644 --- a/components/oss/option_test.go +++ b/components/oss/option_test.go @@ -20,6 +20,8 @@ import ( "testing" "time" + "github.com/aws/aws-sdk-go-v2/feature/s3/manager" + "github.com/aws/aws-sdk-go-v2/service/s3" "github.com/stretchr/testify/assert" @@ -56,6 +58,16 @@ func TestCopierOption(t *testing.T) { func TestGetOutput(t *testing.T) { _, err := GetGetObjectOutput(&s3.GetObjectOutput{}) assert.Nil(t, err) + _, err = GetPutObjectOutput(&manager.UploadOutput{}) + assert.Nil(t, err) + _, err = GetDeleteObjectOutput(&s3.DeleteObjectOutput{}) + assert.Nil(t, err) + _, err = GetDeleteObjectTaggingOutput(&s3.DeleteObjectTaggingOutput{}) + assert.Nil(t, err) + _, err = GetGetObjectTaggingOutput(&s3.GetObjectTaggingOutput{}) + assert.Nil(t, err) + _, err = GetCopyObjectOutput(&s3.CopyObjectOutput{}) + assert.Nil(t, err) _, err = GetListObjectsOutput(&s3.ListObjectsOutput{}) assert.Nil(t, err) _, err = GetGetObjectCannedAclOutput(&s3.GetObjectAclOutput{}) From 0928526f85c254b114cb20acf8045ccd885faff9 Mon Sep 17 00:00:00 2001 From: seeflood Date: Thu, 13 Oct 2022 16:54:50 +0800 Subject: [PATCH 17/19] Update cmd/layotto/main.go --- cmd/layotto/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/layotto/main.go b/cmd/layotto/main.go index 749138d3d3..277ff01f15 100644 --- a/cmd/layotto/main.go +++ b/cmd/layotto/main.go @@ -291,7 +291,7 @@ func NewRuntimeGrpcServer(data json.RawMessage, opts ...grpc.ServerOption) (mgrp runtime.WithOssFactory( oss.NewFactory("aws.oss", aws_oss.NewAwsOss), oss.NewFactory("aliyun.oss", aliyun_oss.NewAliyunOss), - oss.NewFactory("ceph.oss", ceph_oss.NewCephOss), + oss.NewFactory("ceph", ceph_oss.NewCephOss), ), // PubSub runtime.WithPubSubFactory( From 3818890d04be8379473077b5787a7bfae485e291 Mon Sep 17 00:00:00 2001 From: seeflood Date: Thu, 13 Oct 2022 16:55:58 +0800 Subject: [PATCH 18/19] Update cmd/layotto_without_xds/main.go --- cmd/layotto_without_xds/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/layotto_without_xds/main.go b/cmd/layotto_without_xds/main.go index 4d1603ed1a..cbce73d265 100644 --- a/cmd/layotto_without_xds/main.go +++ b/cmd/layotto_without_xds/main.go @@ -410,7 +410,7 @@ func NewRuntimeGrpcServer(data json.RawMessage, opts ...grpc.ServerOption) (mgrp runtime.WithOssFactory( oss.NewFactory("aws.oss", aws_oss.NewAwsOss), oss.NewFactory("aliyun.oss", aliyun_oss.NewAliyunOss), - oss.NewFactory("ceph.oss", ceph_oss.NewCephOss), + oss.NewFactory("ceph", ceph_oss.NewCephOss), ), // Sequencer From cb4356ae50d66c4c0e739adc16c02a2df89cf0ab Mon Sep 17 00:00:00 2001 From: seeflood Date: Thu, 13 Oct 2022 16:56:05 +0800 Subject: [PATCH 19/19] Update cmd/layotto_multiple_api/main.go --- cmd/layotto_multiple_api/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/layotto_multiple_api/main.go b/cmd/layotto_multiple_api/main.go index 3c5ff332e6..bc0d51af5e 100644 --- a/cmd/layotto_multiple_api/main.go +++ b/cmd/layotto_multiple_api/main.go @@ -305,7 +305,7 @@ func NewRuntimeGrpcServer(data json.RawMessage, opts ...grpc.ServerOption) (mgrp runtime.WithOssFactory( oss.NewFactory("aws.oss", aws_oss.NewAwsOss), oss.NewFactory("aliyun.oss", aliyun_oss.NewAliyunOss), - oss.NewFactory("ceph.oss", ceph_oss.NewCephOss), + oss.NewFactory("ceph", ceph_oss.NewCephOss), ), // PubSub